2011-10-26 80 views
4

對於我的活動我使用3個自定義視圖堆疊。 下面的一個是SurfaceView全屏,中間的一個是從GridView派生的,並覆蓋onDraw以添加自定義圖形。無效()自定義視圖不會導致onDraw(Canvas c)被調用

最上面的一個直接來自View,位於屏幕的一個角落,並作爲一個旋鈕來控制其他兩個視圖(這是有問題的視圖)。

到自定義動畫添加到該視圖中,我使用這種模式:

public class StubKnobView extends View{ 

    private Drawable knob; 
    private Point knobPos; 
    private float rotation; 
    private boolean needsToMove; 

    public void moveKnob(){ 
      /* ...various calculations... */ 
      this.needsToMove=true; 
      invalidate(); //to notify the intention to start animation 
    } 

    private void updateAnimation(){ 
     /* ........... */ 
     this.needsToMove= !animationComplete; 
     invalidate();   
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     int saveCount=canvas.getSaveCount(); 
     canvas.save(); 
     canvas.rotate(this.rotation, this.knobPos.x, this.knobPos.y); 
     this.knob.draw(canvas); 
     canvas.restoreToCount(saveCount); 
     if(this.needsToMove){ 
      updateAnimation(); 
     } 
    } 
} 

理想地,如果存在待決的動畫,每個繪圖循環的視圖應該自動無效之後。

現在,這不起作用,強制動畫我必須觸摸屏幕,導致onDraw循環。 使用開發工具的「顯示屏更新」我發現沒有屏幕無效/更新週期發生,除了當我點擊屏幕。 指定髒rect也沒有效果。

那麼,任何想法在哪裏看看知道爲什麼這種無效/繪製循環沒有按照預期的方式工作?

回答

0

在你的視圖中用一個私人類來嘗試這樣的事情。這個想法不是從onDraw()內撥打invalidate()。而是將其發佈到運行隊列中。在View構造函數中實例化私有類,然後在需要動畫時調用animateKnob.start()。然後onDraw()就可以專注於繪圖。

public void moveKnob(){ 

    // update the state to draw... KnobPos, rotation 
    invalidate() 

} 


private class AnimateKnob{ 
    public void start(){ 
     // Do some calculations if necessary 
     // Start the animation 
     MyView.this.post(new Runnable() { 
     stepAnimation() 
     }); 
    } 

    public void stepAnimation(){ 
    // update the animation, maybe use an interpolator. 
    // Here you could also determine if the animation is complete or not 

    MyView.this.moveKnob(); 

    if(!animationComplete){ 
     // Call it again 
     MyView.this.post(new Runnable() { 
      stepAnimation() 
     }); 
    } 

    } 

} 
+0

最後我用的解決方案與此類似 – andijcr

2

我反應過這種情況,也懷疑invalidate()不會讓onDraw()再次被調用。

在簡化了業務代碼之後,事實證明存在一個死循環 - 迭代過多,會阻塞UI線程。

所以,我的建議是確保UI線程先順利進行。

相關問題