Edited at

AndroidでAnimatorSetをRepeatするときの注意点

More than 3 years have passed since last update.

ちょっとハマったのでメモ。


AnimatorSetをリピート

Androidで xmlのAnimatorを定義する際、<set> タグの属性でrepeatさせることができない。

なので通常は以下のように繰り返し再生する。

animator.addListener(object : Animator.AnimatorListener {

override fun onAnimationRepeat(animation: Animator?) {
}

override fun onAnimationStart(animation: Animator?) {
}

override fun onAnimationCancel(animation: Animator?) {
}

override fun onAnimationEnd(animation: Animator?) {
animation?.start()
}
})
animator.start()

だがこのままだとアニメーションが終了することができない。

viewを置換したあともAnimationが残り続け、いずれはStackOverflowExceptionを起こす。

var canceled = false

animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {
}

override fun onAnimationStart(animation: Animator?) {
canceled = false
}

override fun onAnimationCancel(animation: Animator?) {
canceled = true
}

override fun onAnimationEnd(animation: Animator?) {
if (!canceled) {
animation?.start()
}
}
})
animator.start()

きちんとキャンセル時の対応を入れてあげればOK。