FrameAnimationがonCreateでスタートすると止まってしまう
AndroidのFrameAnimationを使って、アニメーションGIFのようにコマ割りのアニメーションを表現できるのですが、onCreateでそのアニメーションをスタートさせると動かない端末があったので、その回避策をご紹介。
ちなみに、動かなかったのは、
SH003SH
Xperia(初期のもの)
回避法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については、
がとても参考になりました。