我正在开发一款需要绘制到SurfaceView的游戏 帆布。我正在使用SurfaceHolder来获取Canvas以绘制,和 在单独的线程中执行绘图。我画的一切都显示出来 正确的除了这一个动画。
这是动画定义(它在res / drawable /中 my_animation.xml:
以下是我如何将它绘制到Canvas:
AnimationDrawable ad =(AnimationDrawable)getResources()。getDrawable(R.drawable.my_animation); ad.draw(帆布); ad.start();
但屏幕上只显示第一帧。
我错过了什么?
谢谢
答案 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的简单界面。
要在自定义视图中支持动画可绘制内容,您需要做两件事:
setCallback
。即使base View
实现Drawable.Callback
,也不需要编写自己的包装器。verifyDrawable
也会为您的动画Drawable返回true。 至于为什么有人会需要它 - 我刚刚在RecyclerView.ItemDecoration
中实现了动画可绘制支持,这有多酷: - )
答案 3 :(得分:0)
您正在使用Canvas意味着,您正在编写低级别的代码。在低级别你必须做的一切。使用View(ImageView)意味着,它是高级别的。在ImageView中已经在低级别定义了如何处理AnimationDrawable。
答案 4 :(得分:0)
Lars Blumberg的回答是正确的,但文档不正确;您还需要考虑到这一点:animation start issue