我做了这个相当简单的视图。它应该在一段时间内(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();
}
}
}
答案 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更忙于计算这些实体的所有数据,所以每帧需要更长时间来处理)。
解决此问题的方法有两种: