动画在Canvas上移动的线

时间:2012-02-05 13:04:51

标签: java android

我做了这个相当简单的视图。它应该在一段时间内(DURATION)为从左到右的红线设置动画。它应该每DELAY更新一次它的位置,这样你就可以根据需要调整动画,使其更加平滑。应该注意的是,我正在模拟器上测试它。好吧,如果我增加DELAY,那么动画会更快完成,即使它对整个动画时间没有影响。我只是简单地制作动画,占用了所有资源吗?还是我的数学关闭?

public class AnimView extends View {

    // Animation duration in milliseconds
    private static final int DURATION = 4000;

    // Update frame every delay (in milliseconds)
    private static final int DELAY = 10;

    private int pos;
    private long lastTick;
    private Paint paint;

    public AnimView(Context context, AttributeSet attrs) {
        super(context, attrs);
        pos = 0;
        lastTick = 0;
        paint = new Paint();
        paint.setColor(Color.RED);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        if(System.currentTimeMillis() - lastTick >= DELAY) {
            // Calculate a new position for the line
            pos += (int) (((double) DELAY / DURATION) * getWidth());

            lastTick = System.currentTimeMillis();
        }

        canvas.drawRect(pos, 0, pos + 1, getHeight(), paint);

        if(pos < getWidth()) {
            // Position is still below getWidth, keep animating
            postInvalidate();
        }

    }

}

2 个答案:

答案 0 :(得分:2)

您应该在if语句中更新lastTick:

 long currentTime = System.currentTimeMillis();
 if(currentTime - lastTick >= DELAY) {
   // Calculate a new position for the line
   pos += (int) (((double) DELAY / DURATION) * getWidth());
   lastTick = currentTime;
 }

否则,您将在DELAY通过后每次绘制。因此,当您增加DELAY时,会减少绘图,因此程序会更快完成。

答案 1 :(得分:1)

为此线程添加一些额外的颜色,这是游戏开发中众所周知的问题。如果搜索“固定时间步长与可变时间步长”,您可以在其上找到大量资源,例如:http://gafferongames.com/game-physics/fix-your-timestep/

它的要点是动画的速度与您当前的帧速率直接相关。这就是为什么在旧的NES megaman游戏中,当屏幕上有很多敌人时,你会有一段时间的慢下来(因为CPU更忙于计算这些实体的所有数据,所以每帧需要更长时间来处理)。

解决此问题的方法有两种:

  1. 移动到一个可变时间步长,您可以将每个移动乘以每帧动画之间的进度时间。这样,当该数量因任何原因而改变时,您的动画看起来都是一样的。
  2. 分隔更新和绘制阶段,以便您可以控制传递到更新方法的时间差异,无论您绘制的速度有多快。