前言概要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