我正在尝试执行20次旋转画布的基本任务 第二个使用计时器但它似乎没有正常工作和它 滞后。例如,如果我每50毫秒旋转矩形0.3度 应该在第二个旋转6度,但事实并非如此。它 轮换真的很慢。这是我的示例代码:
//Code for update task
class UpdateTimeTask extends TimerTask {
public void run() {
hndView.post(new Runnable() {
public void run() {
hndView.invalidate(); //this code invalidates custom view that calls onDraw to draw rotated hand
}
});
}
}
//Code for onDraw method of custom view that needs to be update
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//ang is angle to rotate and inc is float value of 0.3 degree to be incremented
ang = ang + inc;
if (ang >= 360) ang = ang - 360;
canvas.rotate(ang, canvas.getWidth()/2, canvas.getHeight()/2);
canvas.drawRect((canvas.getWidth()/2 - 2), (canvas.getHeight()/2 - 125), (canvas.getWidth()/2 + 2), (canvas.getHeight()/2 + 10), mTextPaint);
canvas.restore();
}
//code to schedule task
Timer timer = new Timer();
UpdateTimeTask tt = new UpdateTimeTask();
timer.schedule(tt, 0, 50);
任何人都可以告诉我这里我做错了什么?我应该用吗 执行此任务的方法不同?因为很难相信 你不能简单地将矩形平滑旋转20次 一秒钟。
答案 0 :(得分:2)
Timer
/ TimerTask
不应该是精确的,不应该用于此目的。遵循2D游戏开发的配方,例如SDK中包含的LunarLander示例。或者,您可以在find上搜索StackOverflow和sorts useful个subject个帖子。
答案 1 :(得分:1)
我相信你没有使用SurfaceView。
画布就像画布那样用于控制而不是快速渲染(读取> 10fps)
如果你想要性能,你需要使用SurfaceView,你平均25-30 fps或者opengl
请阅读:http://developer.android.com/guide/topics/graphics/index.html
答案 2 :(得分:0)
对invalidate的调用次数不必等于对onDraw的调用次数。如果您的计时器在UI线程有机会运行之前最终连续运行两次,则双重无效将最终仅导致单次轮换。考虑输入调试代码来验证对这两种方法的调用次数。