我有一个设计问题所以我不会以错误的方式开始。我计划有一个精灵,它动画移动,我想移动这个精灵(每秒更换一次位置)。
我注意到一些教程谈论有一个游戏循环,onDraw on Canvas,bitmap ..etc
但是,我正在考虑使用drawableAnimation,我在其中指定要在xml中加载的图像集并在其上调用start。然后我可以在每秒所需的位置绘制(没有循环,它更像是每秒从不同进程调用的侦听器)。
你预见到一个问题吗?上述方法有任何问题谢谢
答案 0 :(得分:0)
可绘制动画需要固定的帧动画。把它想象成一本翻书。 drawable必须是你画布的整个尺寸,你的精灵必须在一些透明背景上预渲染才能达到你的效果。根据帧的大小和数量,它还需要大量的纹理存储器。
"游戏循环"正如你所说的那样是Android已经在某种程度上提供的东西。在标准画布设置中,您拥有"主线程"。因此,对于像Handler
这样的实体,如果愿意,可以勾选帧。
即
Handler handler;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
handler = new Handler();
handler.post(new Runnable() {
public void run() {
boolean isLastFrame = drawFrame();
if (!isLastFrame) {
handler.postDelayed(this, ONE_SECOND_MILLIS);
}
}
});
这也不是最好的。
您也可以将精灵封装在View
或自定义Drawable
内,并在onDraw()
方法中更新画布。
public void onDraw(Canvas canvas) {
// clear canvas
mPaint.setColor(Color.WHITE);
canvas.drawPaint(mPaint);
// Draw current
mPaint.setColor(Color.BLACK);
canvas.drawRect(rect, mPaint);
}
public void moveSprite() {
rect.offset(3, 3);
invalidate();
}
如果使用View
,您还可以使用ObjectAnimator
将视图从位置(x1,y1)转换为(x2,y2)。
public void moveTo() {
if (!moveNeeded) {
return;
}
View view = getMyView();
view.animate().x(1).y(1).setListener(new Animator.AnimatorListener() {
public void onAnimationCancel(Animator a) { }
public void onAnimationStart(Animator a) {
}
public void onAnimationEnd(Animator a) {
moveTo();
}
public void onAnimationRepeat(Animator a) {
}
});
}