我的问题是,我正在尝试平滑地连续旋转画布。问题是,它看起来并不顺利。以下是我的代码;
rotateRunnable.run();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
rect.set(xLeft, yTop, xRight, yBottom);
paint.setColor(color);
if(rotate)
canvas.rotate(rotateAngle,CoordinateUtils.centerX,CoordinateUtils.centerY);
canvas.drawRect(rect,paint);
}
Handler handler = new Handler(Looper.getMainLooper());
Runnable rotateRunnable = new Runnable(){
public void run(){
if(rotateReverse)
rotateAngle = rotateAngle - DValues.markerSpeed;
else
rotateAngle = rotateAngle + DValues.markerSpeed;
postInvalidate(); //will trigger the onDraw
handler.postDelayed(this,1); //
}};
在线程中翻译视图是个好主意吗?如何实现连续的平稳运动?另外我应该在哪里检查与另一个视图对象的碰撞检测? OnDraw或其他地方?
答案 0 :(得分:1)
我认为问题是你每1毫秒调用一次处理程序,所以你只是不断地调用这个方法。相反,由于逻辑非常简单和容易,因此最好将其移动到onDraw()方法。然后在View上调用invalidate()。然后,所有计算都将在每个绘制周期完成。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(rotateReverse)
rotate = rotate - DValues.markerSpeed;
else
rotate = rotate + DValues.markerSpeed;
rect.set(xLeft, yTop, xRight, yBottom);
paint.setColor(color);
canvas.rotate(rotate,CoordinateUtils.centerX,CoordinateUtils.centerY);
canvas.drawRect(rect,paint);
invalidate(); //will trigger the onDraw
}
因此,这将告诉系统执行另一次绘制以更新View
。它只会在绘制周期中调用invalidate()
。如果手机仍然以60 fps的速度绘制,那么旋转将每秒调用60次,因此您可能需要调整速度(可能使其偏离手机的像素密度)。您还需要根据自上次绘制周期后的时间长度来确定旋转距离(如果UI冻结)。