前言概要app
在項目中遇到須要循環播放動畫的需求。框架
鄙人在實現時沒有用到流行的動畫框架,緣由是項目中動畫需求較少,並不須要爲簡單的動畫引入一個動畫框架,譬如
lottie
。ide
一個上下抖動的位移動畫,向下和向上是兩種位移加速度,如圖:動畫
這裏用到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)
}
}
複製代碼
下面的代碼並不能把一個執行動畫的 view 給隱藏掉spa
//開啓
view.startAnimation(createAnimation(view.contoxt, view))
//隱藏
view.clearAnimation()
view.visibility = View.GONE
複製代碼
先把AnimationListener
設置爲null
,再隱藏,解決問題3d
view.animation?.setAnimationListener(null)
view.clearAnimation()
view.visibility = View.GONE
複製代碼
實際速度會比 gif 快一些code