使用drawableAnmiation动画精灵

时间:2014-11-16 07:04:17

标签: android android-drawable

我有一个设计问题所以我不会以错误的方式开始。我计划有一个精灵,它动画移动,我想移动这个精灵(每秒更换一次位置)。

我注意到一些教程谈论有一个游戏循环,onDraw on Canvas,bitmap ..etc

但是,我正在考虑使用drawableAnimation,我在其中指定要在xml中加载的图像集并在其上调用start。然后我可以在每秒所需的位置绘制(没有循环,它更像是每秒从不同进程调用的侦听器)。

你预见到一个问题吗?上述方法有任何问题

谢谢

1 个答案:

答案 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) {
    }
  });
}