fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

animatorが終わった時の挙動を変えたかった

AndroidValueAnimatorでワンショットのアニメーションを実装していたところ、動いている最中に止めたくなった時に

  • 最初の状態に戻したい
  • 最後の状態まですっ飛ばしたい

ということがあって少し考えた。

AndroidAnimatorクラスにはcancel()end()というメソッドがあってどちらもアニメーションが止まるのだが、

  • cancel()は呼ばれた時の状態で止まる
  • end()は最後の状態になる

という感じになっていた*1ので、cancel()のほうの挙動を変えるためにAnimatorListenerをラップしてAnimatorListener.onAnimationCancel()の中で最初の状態に戻すようなクラスを作った。

github.com

ワンショットのアニメーションなので、アニメーションが止まった時にリスナをremoveする処理もついでに入れた。最初コードを読んでいるとcancel()を呼んだ時にもAnimatorListener.onAnimationEnd()が呼ばれそうに見えたのでonAnimationCancel()が呼ばれたときにフラグを立ててonAnimationEnd()の中身が実行されないようにしていたんだけど、実際にはonAnimationEnd()は呼ばれなかったので最終的にフラグは使わないことになった。今後いろんなケースに対応していくなかでキャンセルフラグを復活させることがあるかもしれない。

*1:API Level 23のエミュレータで確認