我遇到了奇怪的行为。
如果以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,但已关闭,没有任何评论

我的问题是:


是否存在真正的错误或我误解了某些内容?
我怎么知道什么时候AnimationDrawable完成?

最佳答案

看了the source之后,我只能得出一个结论,将其设置为oneshot意味着它确实是oneshot动画,没有重复。至少,并非没有首先调用stop()的情况。

如果在完成后调用stop(),则对start()的下一次调用正常(至少在我的测试中)。如何调用stop()由您决定,但是您可以安排一个计时器在调用start()的总时长结束后运行它。此类中没有回调确实有点烂。

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

10-05 21:37