ぎじゅつめもブログ

主にアプリ開発の技術メモを残していきます。

【Android】AnimationDrawableのイベント検知

AnimationDrawableを使ってImageViewをパラパラアニメにした際に、アニメーションが終わったタイミングを検知する方法です。
(確認環境:Android 4.4.2)

こちらに答えがありました。

Android AnimationDrawable and knowing when animation ends - Stack Overflow

下記のメソッドを用意します。

private void checkIfAnimationDone(AnimationDrawable anim){
    final AnimationDrawable a = aim;
    int timeBetweenChecks = 200; // この値はパラパラアニメの duration と一致させる
    Handler h = new Handler();
    h.postDelayed(new Runnable(){
        public void run(){
            if (a.getCurrent() != a.getFrame(a.getNumberOfFrames() - 1)){
                checkIfAnimationDone(a);
	    } else{
	        // アニメーションが終わったときの処理...
	    }
        }
    }, timeBetweenChecks);
}

使い方は以下のようにします。

ImageView anime = (ImageView) layoutView.findViewById(R.id.hoge_image);
anime.setBackgroundResource(R.drawable.hoge_animation);
AnimationDrawable animeFrame = (AnimationDrawable) anime.getBackground();
animeFrame.start();
checkIfAnimationDone(animeFrame);

上記コード中のhoge_animation.xmlは例えばこのようにします。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >
    <item android:drawable="@drawable/hoge_1" android:duration="200" />
    <item android:drawable="@drawable/hoge_2" android:duration="200" />
    <item android:drawable="@drawable/hoge_3" android:duration="200" />
</animation-list>

以上です。