9

AnimationDrawableアクティビティが表示されたときにアニメーション化する必要がある はどこから開始すればよいですか?

開発者ガイドではを使用することを推奨onWindowFocusChangedしていますが、アクティビティが の一部である場合に常に呼び出されるとは限りませんTabHost

私は引用します:

AnimationDrawable で呼び出された start() メソッドは、Activity の onCreate() メソッド中に呼び出すことができないことに注意することが重要です。これは、AnimationDrawable がまだウィンドウに完全にアタッチされていないためです。操作を必要とせずにアニメーションをすぐに再生したい場合は、Activity の onWindowFocusChanged() メソッドから呼び出すことができます。このメソッドは、Android がウィンドウにフォーカスを移したときに呼び出されます。

4

4 に答える 4

7

この質問が少し古いことは知っていますが、これは、私のようにこの質問に出くわした人にとって役立つかもしれません。AnimationDrawable を開始する 1 つの方法は、新しい Runnable を作成し、ImageView から post メソッドを使用することです。

あなたは次のようにすることができます:

ImageView spinner = (ImageView) findViewById(R.id.my_imageView);
spinner.setBackgroundResource(R.drawable.spinner);
spinner.post(new Runnable() {
    public void run() {
        AnimationDrawable anim = (AnimationDrawable) spinner.getBackground();
        anim.start();
    }
});
于 2012-08-10T21:01:28.757 に答える
6

並列スレッドアプローチが最も一般的なアプローチのようですが、2つの大きな問題が発生します。

  • ドキュメントによると、すべてのUI関連のコードはメイン(別名「GUI」)スレッドで実行する必要があります。AnimationDrawableで.start()を呼び出すことは、純粋なUI操作とは見なされないかもしれませんが、それでもそのルールに従う必要があると感じています。
  • アニメーションがいつ開始されるかを正確に知ることはできません。私はそれを修正することになっていた「魔法の」遅延長の値を持つコードを見てきました。プログラマーがそのアプローチを取るたびに、神が子猫の赤ちゃんを殺すことを知っておく必要があります。

したがって、非常に適切な名前のrunOnUiThread()メソッドを使用することをお勧めします。onResume()で呼び出すと、アニメーションコードがメインスレッドで実行され、ウィンドウがアタッチされた後に実行され、メッセージが処理されようとしている場所が正確にわかり、子猫がメッセージを失う必要がないことが保証されます。生活:

@Override
protected void onResume()
{
    super.onResume();
    runOnUiThread(new Runnable() 
    {
        @Override
        public void run() 
        {
            animation.start();
        }
    });
}
于 2011-02-07T11:57:22.963 に答える
0

アクティビティonResume()は、アクティビティがフォアグラウンドになると常に呼び出されます。そこから起動してみてください。

于 2010-07-19T18:59:19.003 に答える