AnimationDrawable没有玩

时间:2011-03-30 18:52:24

标签: android animation drawable

所以我希望我的动画在创建活动后立即启动,但出于某种原因无论我尝试什么都会让它开始。我可以通过点击事件开始,但我想让它自己开始。

这是我拥有的以及如何让它发挥作用?

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();

        }



}

由于

6 个答案:

答案 0 :(得分:61)

我认为你必须在有问题的视图初始化完成后启动动画。您应该可以执行以下操作:

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方法并不总是有用。它似乎更简单,如果它适合你,可能是一个更好的主意。

答案 1 :(得分:21)

我知道这是一个老问题,但我遇到了同样的问题,但答案并没有帮助我。花了几个小时研究它后我终于发现我的问题是我已经将android:src="@drawable/myanimation"添加到了imageview容器中。一旦我删除了这个,上述答案就有效了。我认为动画正在运行但是通过设置src,动画的第一个图像就在它上面,因此我认为它没有播放。

  • 我的最终代码有一个XML文件,动画保存在drawable文件夹中
  • 我的布局有一个未定义android:src的图像视图,并设置为不可见
  • onCreate中,我将imageview设置为可见,并将setBackgroundResource设置为XML文件中描述的动画
  • {li> in onWindowFocusChanged我开始动画。

答案 2 :(得分:3)

在窗口获得焦点后尝试通过覆盖Activity中的onWindowFocusChanged来启动动画:

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

请参阅此处的文档:http://developer.android.com/reference/android/app/Activity.html#onWindowFocusChanged%28boolean%29

答案 3 :(得分:3)

我可以看到动画播放的解决方案。它允许你声明(在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();
    }
}

如果从代码设置drawable,那么你应该覆盖适当的set *()方法并从那里调用updateAnimationsState()。

答案 4 :(得分:2)

还有一个解决方案:

在致电animationDrawable.stop()方法之前致电start()

答案 5 :(得分:0)

当我想按above answers

中提到的方式启动动画时,我通过调用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();