FrameAnimationがonCreateでスタートすると止まってしまう

AndroidのFrameAnimationを使って、アニメーションGIFのようにコマ割りのアニメーションを表現できるのですが、onCreateでそのアニメーションをスタートさせると動かない端末があったので、その回避策をご紹介。

ちなみに、動かなかったのは、

SH003SH
Xperia(初期のもの)

Frameアニメーションについて

このページの下の方で紹介されているFrame アニメーションを御覧ください。

一番分かりやすくまとまっております。

回避法1 onWindowFocusChangedでstartさせる

・frame_animation.xml

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/anim01" android:duration="200" />
    <item android:drawable="@drawable/anim01" android:duration="200" />
    <item android:drawable="@drawable/anim01" android:duration="200" />
</animation-list>
public class StartActivity extends Activity {
    
    Animation frameAnimation;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
	imageView = (ImageView) findViewById(R.id.splash_image);
        imageView.setBackgroundResource(R.anim.anim);
	frameAnimation = (AnimationDrawable) imageView.getBackground();

    }


    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
    	super.onWindowFocusChanged(hasFocus);
    	frameAnimation.start();//onWindowFocusChangedで呼ばないとアニメーションがスタートしない
    }
}

onCreateで使うときに限って、こうしないと止まってしまいます。

原因としては、

AnimationDrawable の start() メソッド呼び出しは、AnimationDrawable が完全にウィンドウにアタッチされていないことから、アクティビティの onCreate() メソッドの間では呼び出せないという点に十分注意してください。 相互動作による要求なしで、アニメーションを即時に再生したい場合は、アクティビティのAndroid がウィンドウにフォーカスしたときに呼び出されるメソッドである onWindowFocusChanged() で呼び出すことにより望んでいた動作が実現できるかもしれません。

らしいです。

回避法2 Handlerを使用する

public class StartActivity extends Activity {

    Animation frameAnimation;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ImageView imageView =(ImageView)findViewById(R.id.image);
        imageView.setBackgroundResource(R.frame_animation);
        frameAnimation = (AnimationDrawable)splashImageView.getBackground();
        //onCreate内でアニメーションをスタートさせる場合、handler postしないとアニメーションが動かない機種があ        るため
        imageView.post(new Runnable() {
	    @Override
	    public void run() {
		frameAnimation.start();
	    }
        });
    }
}


Handlerについては、

AndroidのHandlerとは何か?

がとても参考になりました。