2023-07-14


    val line: ImageView
    val fp: FPGradientView
    val fp2: FPGradientView
    private var distance = 0f

    val animationSet1 = AnimationSet(true)
    val animationSet2 = AnimationSet(true)



    init {
        View.inflate(context, R.layout.layout_fingerprint, this)
        line = findViewById(R.id.line)
        fp = findViewById(R.id.fp)
        fp2 = findViewById(R.id.fp2)
        fp.isup = true
        fp2.isup = false

        line.startAnimation(animationSet1)
        fp.start()
        resetAnim()
    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        distance = h * 0.63f

        fp.setDistance(distance)
        fp.setRadius(h * 0.6f * 48 / 100)
        fp.setWidth(w / 1f)
        fp.setMHeight(h / 4f)
        fp.setNHeight(h / 1f)

        fp2.setDistance(distance)
        fp2.setRadius(h * 0.6f * 48 / 100)
        fp2.setWidth(w / 1f)
        fp2.setMHeight(h / 4f)
        fp2.setNHeight(h / 1f)

        val alphaAnimation1 = AlphaAnimation(0f, 1.0f)
        alphaAnimation1.duration = 500

        val alphaAnimation2 = AlphaAnimation(1.0f, 0f)
        alphaAnimation2.duration = 500
        alphaAnimation2.startOffset = 500


        val translateAnimation1 = TranslateAnimation(
            line.x, //x轴起始位置
            line.x, //x轴最终位置
            line.y, //y轴起始位置
            line.y + distance //y轴最终位置
        )
        translateAnimation1.duration = 1000 //移动持续1秒
        translateAnimation1.interpolator = LinearInterpolator()

        val translateAnimation2 = TranslateAnimation(
            line.x, //x轴起始位置
            line.x, //x轴最终位置
            line.y + distance, //y轴起始位置
            line.y  //y轴最终位置
        )
        translateAnimation2.duration = 1000 //移动持续1秒
        translateAnimation2.interpolator = LinearInterpolator()

        animationSet1.apply {
            addAnimation(alphaAnimation1)
            addAnimation(alphaAnimation2)
            addAnimation(translateAnimation1)
        }
        animationSet2.apply {
            addAnimation(alphaAnimation1)
            addAnimation(alphaAnimation2)
            addAnimation(translateAnimation2)
        }


        animationSet1.setAnimationListener(object : Animation.AnimationListener {
            override fun onAnimationStart(animation: Animation?) {
            }

            override fun onAnimationEnd(animation: Animation?) {
                line.startAnimation(animationSet2)
                fp2.start()
            }

            override fun onAnimationRepeat(animation: Animation?) {}
        })

        animationSet2.setAnimationListener(object : Animation.AnimationListener {
            override fun onAnimationStart(animation: Animation?) {}
            override fun onAnimationEnd(animation: Animation?) {
                line.startAnimation(animationSet1)
                fp.start()
            }

            override fun onAnimationRepeat(animation: Animation?) {}
        })
        Log.d("FPWidget", "start")

    }

    //销毁时停止动画
    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        animationSet1.cancel()
        animationSet2.cancel()
    }

    //开始动画
    fun startAnim(){
        animationSet1.setAnimationListener(object : Animation.AnimationListener {
            override fun onAnimationStart(animation: Animation?) {
            }

            override fun onAnimationEnd(animation: Animation?) {
                line.startAnimation(animationSet2)
                fp2.start()
            }

            override fun onAnimationRepeat(animation: Animation?) {}
        })

        animationSet2.setAnimationListener(object : Animation.AnimationListener {
            override fun onAnimationStart(animation: Animation?) {}
            override fun onAnimationEnd(animation: Animation?) {
                line.startAnimation(animationSet1)
                fp.start()
            }

            override fun onAnimationRepeat(animation: Animation?) {}
        })
        line.alpha = 1f
        line.startAnimation(animationSet1)
        fp.start()
    }

    //停止动画
    fun resetAnim(){
        animationSet1.setAnimationListener(null)
        animationSet2.setAnimationListener(null)
        animationSet1.cancel()
        animationSet2.cancel()
        line.clearAnimation()
        line.alpha = 0f
        fp.cancel()
        fp2.cancel()
    }

    var job:Job? = null
    var clickTime = 0L
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        when(event?.action){
            MotionEvent.ACTION_DOWN ->{
                Log.i("limengzhen","down")
            start()
            }
            MotionEvent.ACTION_UP -> {
                Log.i("limengzhen","up")
                end()
            }
        }
        return super.onTouchEvent(event)
    }

    private fun start(){
        clickTime = System.currentTimeMillis()

        job = GlobalScope.launch(Dispatchers.Main) {
            delay(500)
            startAnim()
        }
    }

    private fun end(){
        val diffTime = System.currentTimeMillis() - clickTime
        if (diffTime < 500) {
            job?.let {
                if (it.isActive){
                    it.cancel()
                }
            }
        } else if (diffTime > 500 && diffTime <4000){
            resetAnim()
        } else {
            Toast.makeText(context,"恭喜你完成一次事件。",Toast.LENGTH_LONG).show()
            resetAnim()
        }

    }



}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 柏拉图说 如果 不幸福,如果 不快乐, 那就放手吧; 如果 舍不得,如果 放不下, 那就痛苦吧! 对于不幸的感情 ...
    日月明心_阅读 42评论 0 0
  • 每日一省 今天又疲惫又欣慰。怎么说呢? 疲惫的是,今天又和孩子耗了一天。感觉很内耗。孩子不肯执行计划,我又...
    bcc87b218fde阅读 548评论 0 0
  • Lesson 18-1 Porpoises There has long been a superstition ...
    草木Lily阅读 968评论 0 0
  • 体验:有一句话是这样说的只要用心,就有可能;只要开始,永远不晚。 核心:付出才有收获 转身:只要我们肯努力,就没有...
    何以解忧啊阅读 1,170评论 0 0
  • z说她俩是绑在一起的,后来x说是的,的确很配,一个很会夸人乐于奉承,一个又总是喜欢被恭维,我现在就是努力提升自己就...
    嗨喽呦阅读 728评论 0 0