web-dev-qa-db-ja.com

AnimationDrawableが再生されない

そのため、アクティビティが作成されたらすぐにアニメーションを開始したいのですが、何らかの理由で、何をしようとしてもアニメーションが開始されます。クリックイベントを設定することで開始できますが、すべてを単独で開始したいと思います。

これが私が持っているものであり、これをどのように機能させるのですか?

package tween.learn;

import Android.app.Activity;
import Android.graphics.drawable.AnimationDrawable;
import Android.os.Bundle;
import Android.widget.ImageView;

public class Animate extends Activity {

    public ImageView image;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        ImageView tweenImage = (ImageView) findViewById(R.id.imageView1);
        tweenImage.setBackgroundResource(R.anim.cubicfacetween);

        AnimationDrawable frameAnimation = 
                           (AnimationDrawable) tweenImage.getBackground();
        frameAnimation.start();

        }



}

ありがとう

21

問題のビューの初期化が完了した後、アニメーションを開始する必要があると思います。次のようなことができるはずです。

final ImageView tweenImage = (ImageView) findViewById(R.id.imageView1);
tweenImage.setBackgroundResource(R.anim.cubicfacetween);      
tweenImage.post(new Runnable() {
    @Override
    public void run() {
        AnimationDrawable frameAnimation =
            (AnimationDrawable) tweenImage.getBackground();
        frameAnimation.start();
    }
}

編集-この質問により、onWindowFocusChangedメソッドが常に機能するとは限らないと私は信じました。それはより単純に見えます、そしてそれがあなたのために働くならばおそらくより良い考えです。

61
Matthew Willis

私はこれが古い質問であることを知っています、しかし私は同じ問題を抱えていました、しかし答えは私を助けませんでした。何時間もかけて作業した後、私はついに私の問題がimageviewコンテナにAndroid:src="@drawable/myanimation"を追加したことであることに気付きました。これを削除すると、上記の回答が機能しました。アニメーションは実行されていたと思いますが、srcを設定すると、アニメーションの最初の画像がその上に表示されたため、再生されていないと思いました。

  • 私の最終的なコードには、アニメーションがドローアブルフォルダに保存されたXMLファイルがあります
  • レイアウトにAndroid:srcが定義されていないイメージビューがあり、非表示に設定されています
  • onCreateで、imageviewを表示に設定し、setBackgroundResourceをXMLファイルに記述されているアニメーションに設定しました。
  • in onWindowFocusChangedアニメーションを開始します。
21
Laura Bangerter

アニメーションが表示されているときにアニメーションを再生するための私のソリューション。それはあなたが(xmlレイアウトで)宣言して忘れさせてくれます。

class AnimatedImageView extends ImageView {
    // required constructors omitted for clarity 

    private void updateAnimationsState() {
        boolean running = getVisibility() == View.VISIBLE && hasWindowFocus();
        updateAnimationState(getDrawable(), running);
        updateAnimationState(getBackground(), running);
    }

    private void updateAnimationState(Drawable drawable, boolean running) {
        if(drawable instanceof AnimationDrawable) {
            AnimationDrawable animationDrawable = (AnimationDrawable) drawable;
            if(running) {
                animationDrawable.start();
            } else {
                animationDrawable.stop();
            }
        }
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        updateAnimationsState();
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        updateAnimationsState();
    }
}

コードからドローアブルを設定する場合は、適切なset *()メソッドをオーバーライドし、そこからupdateAnimationsState()を呼び出す必要があります。

3
Piotr L.

アクティビティでonWindowFocusChangedをオーバーライドして、ウィンドウがフォーカスを取得した後にアニメーションを開始してみてください。

  @Override
  public void onWindowFocusChanged (boolean hasFocus)
  {
      //Start animation here
  }

こちらのドキュメントを参照してください: http://developer.Android.com/reference/Android/app/Activity.html#onWindowFocusChanged%28boolean%29

3
Ryan Reeves

もう1つの解決策:

animationDrawable.stop()メソッドを呼び出す前に、start()を呼び出します。

2
Ramesh R

上記の回答 で説明したようにアニメーションを開始したいときに、setBackgroundResourceではなくsetImageResourceを呼び出すことでこの問題を修正しました。

private AnimationDrawable animationDrawable;


 fab.setImageResource(R.drawable.animation);
 animationDrawable = (AnimationDrawable) fab.getDrawable();
 fab.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {
        fab.setBackgroundResource(R.drawable.animation);
        animationDrawable.start();
    }
 });

注:アニメーションをリセットするには、

animationDrawable.selectDrawable(0);//animation drawable used here is collection of images
animationDrawable.stop();
0