如何在Android国际象棋游戏中做动画

时间:2010-03-13 14:49:06

标签: android animation

我正在为Android开发国际象棋游戏(androidchess.appspot.com)。如果我想添加动画,我应该使用自定义View扩展Canvas(我现在这样做),还是自定义View扩展SurfaceView?

1 个答案:

答案 0 :(得分:3)

我没有尝试使用View扩展Canvas,但对于我的游戏,我使用的方法与LunarLander示例游戏相同:

public class CustomView extends SurfaceView implements SurfaceHolder.Callback

它的用处在于它为SurfaceHolder提供了句柄(因此您可以调用绘制到屏幕的画布),以及surfaceCreatedsurfaceChanged和{{1的回调}}。这使您可以在表面可用时立即绘制自定义动画,或确保在取消激活后不尝试绘制到画布。浏览LunarLander应该向您展示如何正确使用它们。


编辑:我记得使用SurfaceHolder有用的另一个原因。这是因为,正如我上面提到的,它允许您直接访问绘制到屏幕的画布。使用SurfaceHolder,这不是通过覆盖onDraw而是通过使用surfaceDestroyed之类的东西来完成的。 (有关确切语法,请参阅LunarLander)。这很重要的原因是因为它可以让您精确控制绘图的发生时间。如果只能通过覆盖onDraw()来工作,那么在程序达到“等待”阶段之前不会发生绘图。换句话说,您不能在循环中使用Canvas canvas = mSurfaceHolder.lockCanvas()invalidate(),因为在循环结束之前不会发生绘图。而且,由于你可能会使用循环来绘制一个在屏幕上移动的东西,这就成了一个问题。

注意:可以通过使用多个线程来避免此问题。我只是没有尝试过,因为我的游戏不需要它;唯一的动画是固定长度的动画,以响应用户输入,而不是在后台持续移动的东西,所以我还没有尝试过多个线程。