动画不会在Android上的画布上启动

时间:2010-07-08 12:46:53

标签: android animation canvas

我正在开发一款需要绘制到SurfaceView的游戏 帆布。我正在使用SurfaceHolder来获取Canvas以绘制,和 在单独的线程中执行绘图。我画的一切都显示出来 正确的除了这一个动画。

这是动画定义(它在res / drawable /中 my_animation.xml:

以下是我如何将它绘制到Canvas:

AnimationDrawable ad =(AnimationDrawable)getResources()。getDrawable(R.drawable.my_animation); ad.draw(帆布); ad.start();

但屏幕上只显示第一帧。

我错过了什么?

谢谢

5 个答案:

答案 0 :(得分:2)

如果我获得了正确的引用,您必须将AnimationDrawable分配给ImageView,例如来自http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html的示例:

// Load the ImageView that will host the animation and
// set its background to our AnimationDrawable XML resource.
ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
img.setBackgroundResource(R.drawable.spin_animation);

// Get the background, which has been compiled to an AnimationDrawable object.
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();

// Start the animation (looped playback by default).
frameAnimation.start()

在您的情况下,您没有将AnimationDrawable分配给任何视图,因此我认为这就是为什么它不会更新。所以你必须手动调用AnimationDrawable.getFrame(int)

如果您已经在使用单独的线程,为什么不同时涉及动画的代码?在我看来,这会使你的代码更加一致。

答案 1 :(得分:2)

虽然这是一个老问题,我也遇到了这个问题,并找出了一个解决方法,所以我只是在这里发布,以防任何人搜索。

```的java

final AnimationDrawable animationDrawable = ...;

final View v = new View(this) {

    @Override
    protected void onDraw(Canvas canvas) {
        animDrawable.draw(canvas);
    }

};

animationDrawable.setCallback(new Callback() {

    @Override
    public void unscheduleDrawable(Drawable who, Runnable what) {
        v.removeCallbacks(what);
    }

    @Overridew
    public void scheduleDrawable(Drawable who, Runnable what, long when) {
        v.postDelayed(what, when - SystemClock.uptimeMillis());
    }

    @Override
    public void invalidateDrawable(Drawable who) {
        v.postInvalidate();
    }
});

```

答案 2 :(得分:1)

所有类型的动画drawable(转换等)需要Callback来安排重绘。正如zhang演示的那样,它是一个发布Runnables的简单界面。

要在自定义视图中支持动画可绘制内容,您需要做两件事:

  • 将您的视图传递给您的动画Drawable setCallback。即使base View实现Drawable.Callback,也不需要编写自己的包装器。
  • 覆盖verifyDrawable也会为您的动画Drawable返回true。

至于为什么有人会需要它 - 我刚刚在RecyclerView.ItemDecoration中实现了动画可绘制支持,这有多酷: - )

答案 3 :(得分:0)

您正在使用Canvas意味着,您正在编写低级别的代码。在低级别你必须做的一切。使用View(ImageView)意味着,它是高级别的。在ImageView中已经在低级别定义了如何处理AnimationDrawable。

答案 4 :(得分:0)

Lars Blumberg的回答是正确的,但文档不正确;您还需要考虑到这一点:animation start issue