AnimationDrawable.isRunning()始终返回true

时间:2013-02-22 14:36:05

标签: android android-animation

我遇到了一种奇怪的行为。 如果我使用AnimationDrawable启动start(),则在动画完成后,方法isRunning()仍会返回true。它是“一次性”动画,没有循环播放。

以下是一个示例代码:

public class MyActivity extends Activity {
    private AnimationDrawable cartoon;
    private ImageView iv;
    private BitmapDrawable frame0, frame1;
    private final int sleep=1000;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        cartoon = new AnimationDrawable();
        cartoon.setOneShot(true);
        frame0 = new BitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.gridx0));
        frame1 = new BitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(), R.drawable.gridx1));
    }

    @Override
    protected void onStart() {
        super.onStart();
        if(iv==null) iv = (ImageView) findViewById(R.id.imageView);
        cartoon.addFrame(frame0, sleep);
        cartoon.addFrame(frame1, sleep);
        iv.setImageDrawable(cartoon);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(cartoon.isRunning()) Log.d("AnimationTest", "Animation already started");
        else cartoon.start();
        return true;
    }
}

这是输出:

02-22 14:18:42.187: DEBUG/AnimationTest(2043): Animation already started
02-22 14:18:52.093: DEBUG/AnimationTest(2043): Animation already started
02-22 14:18:52.166: DEBUG/AnimationTest(2043): Animation already started
...and so on.

因此动画第一次运行,然后isRunning将永远返回true。 I also found similar issue posted to code.google.com,但它没有任何评论关闭

我的问题是:

  1. 是否有真正的错误或我误解了什么?
  2. 如何判断AnimationDrawable何时完成?

4 个答案:

答案 0 :(得分:1)

尝试扩展AnimationDrawable,声明自己的布尔字段将用作标志。覆盖isRunning()并返回布尔字段。根据类动画侦听器更改标志(start,repeat,end)。 :)

答案 1 :(得分:1)

在看了the source之后,我只能得出这样的结论:将它设置为oneshot意味着它真正一个单动画动画,没有重复。至少,不能先调用stop()

如果你完成后调用stop(),那么下一次调用start()就可以了(至少在我的测试中)。您如何致电stop()取决于您,但您可以安排计时器在您致电start()后经过总持续时间后再运行该计时器。在这个课程中没有回调确实有点糟糕。

如果您经常使用此机制,则可能值得扩展AnimationDrawable以进行回调。如果你这样做,你应该把它张贴在某个地方,以便将来你自己和其他人更容易。

答案 2 :(得分:0)

处理动画结束的方法是计算动画的总持续时间,并在该持续时间到期后发送事件。

    private AnimationDrawable timerAnimation;

...

private void startTimerAnimation() {
    int timerAnimationDuration = calcTimerAnimationDuration();
    timerAnimation.start();
    timerAnimationEndHandler.sendEmptyMessageDelayed(0, timerAnimationDuration);
}


private int calcTimerAnimationDuration() {
    int total = 0;
    for (int i = 0; i < timerAnimation.getNumberOfFrames(); i++) {
        total += timerAnimation.getDuration(i);
    }
    return total;
}


private Handler timerAnimationEndHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        onTimerAnimatonFinished();
};

答案 3 :(得分:-1)

如果你尝试会发生什么:

    @Override
public boolean onTouchEvent(MotionEvent event) {
    if(cartoon.isRunning()){
      Log.d("AnimationTest", "Animation already started");
      return false;
   }else{
       cartoon.start();
      return true;
    }

}