Android Canvas如何实现连续平滑运动(旋转)

时间:2016-11-04 21:15:06

标签: android animation canvas

我的问题是,我正在尝试平滑地连续旋转画布。问题是,它看起来并不顺利。以下是我的代码;

 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或其他地方?

1 个答案:

答案 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冻结)。