2016-11-04 90 views
0

我的问题是,我试图围绕某个点平滑地连续旋转画布。问题是,它看起来不顺利。下面是我的代码。Android帆布如何实现连续平滑运动(旋转)

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毫秒调用一次'Handler',所以你只是不断地调用这个方法。相反,由于逻辑非常简单,所以最好将它移动到'onDraw()'方法。然后在视图上调用'invalidate()'。然后,所有的计算将在每个绘制周期完成。 – DeeV

+0

谢谢你的回答,实际上我所调用的只是Viewi的无效方法罢了。你能举一个例子吗? –

+0

另外,我应该在哪里检查碰撞检测? OnDraw或..? –

回答

1

我认为问题是你每1毫秒调用一次Handler,所以你只是不断地调用这个方法。相反,由于逻辑非常简单,所以最好将其移至onDraw()方法。然后在视图上调用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冻结的情况下)的位置来确定旋转距离。

+0

非常感谢,顺便提一下,在每次抽奖中致使无效都会严重影响表现?应postInvalidate或无效? –

+0

与永不改变的静态视图相比,它会导致更多电量消耗和占用更多资源,但持续动画的任何内容都会不断重绘。 – DeeV

+0

'postInvalidate()'只是让你从非UI线程调用'invalidat()'。 – DeeV