2016-11-04 91 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