ちょっとハマったのでメモ。
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。