解決Android View播放動畫後沒法隱藏的問題

前言概要app

在項目中遇到須要循環播放動畫的需求。框架

鄙人在實現時沒有用到流行的動畫框架,緣由是項目中動畫需求較少,並不須要爲簡單的動畫引入一個動畫框架,譬如lottieide

1. 需求

一個上下抖動的位移動畫,向下和向上是兩種位移加速度,如圖:動畫

2. 實現代碼

這裏用到AnimationSet因此不能repeat動畫,只能用AnimationListener作一個比較hack的重複調用。this

private fun createAnimation(context: Context, view: View): Animation {
    return createAnimationNoListener(context).also { set ->
        set.setAnimationListener(object : Animation.AnimationListener {
            override fun onAnimationRepeat(animation: Animation?) {

            }

            override fun onAnimationEnd(animation: Animation?) {
                view.startAnimation(createAnimationNoListener(context).also {
                    it.setAnimationListener(this)
                })
            }

            override fun onAnimationStart(animation: Animation?) {

            }
        })
    }

}

private fun createAnimationNoListener(context: Context): AnimationSet {
    return AnimationSet(false).also {
        val pxDistance = context.resources.getDimensionPixelSize(R.dimen.padding_6_normal).toFloat()
        val downAnim = TranslateAnimation(0f, 0f, 0f, pxDistance).apply {
            this.interpolator = AccelerateInterpolator()
            this.duration = 400
        }
        val upAnim = TranslateAnimation(0f, 0f, pxDistance, 0f).apply {
            this.interpolator = AccelerateDecelerateInterpolator()
            this.duration = 400
            this.startOffset = 400

        }
        it.addAnimation(downAnim)
        it.addAnimation(upAnim)
    }
}
複製代碼

3. 問題的出現

下面的代碼並不能把一個執行動畫的 view 給隱藏掉spa

//開啓
view.startAnimation(createAnimation(view.contoxt, view))

//隱藏
view.clearAnimation()
view.visibility = View.GONE
複製代碼

4. 解決辦法

先把AnimationListener設置爲null,再隱藏,解決問題3d

view.animation?.setAnimationListener(null)
view.clearAnimation()
view.visibility = View.GONE
複製代碼

5. 實現效果

實際速度會比 gif 快一些code

相關文章
相關標籤/搜索