2011-05-10 9 views
1

我想要鏡像LinearLayout。 爲了完成這項工作,我擴展了LinerLayout來創建我自己的視圖組件。重寫dispatchDraw時不會自動繪製視圖

這是什麼樣子:

public class FlipLayout extends LinearLayout implements Runnable { 
     private boolean isMirroring = true; 
     private Handler handler; 

     public FlipLayout(Context context) { 
      super(context); 
      this.setWillNotDraw(false); 
     } 

     public FlipLayout(Context context, AttributeSet attr) { 
      super(context, attr); 
      this.setWillNotDraw(false); 
      handler = new Handler(); 
      handler.postDelayed(this, 30); 

     } 

     @Override 
     protected void dispatchDraw(Canvas canvas) { 
      canvas.save(); 
      if (isMirroring) { 
       canvas.rotate(180, getWidth()/2, getHeight()/2); 
      } 
      super.dispatchDraw(canvas); 
      canvas.restore(); 
     } 

     @Override 
     public boolean dispatchTouchEvent(MotionEvent event) { 
      if (isMirroring) 
       event.setLocation(getWidth() - event.getX(), 
         getHeight() - event.getY()); 
      return super.dispatchTouchEvent(event); 
     } 

     @Override 
     public void run() { 
      invalidate(); 
      handler.postDelayed(this, 30); 
     } 

    } 

該類運作良好,但只實現Runnable接口時,並通過調用無效()每隔幾毫秒。

如果我只旋轉畫布而不使視圖失效,則不會繪製子視圖的更改。 現在我想知道這種行爲的原因是什麼,以及如果沒有Runnable/Handler實現的情況下獲得它的方式。 如果我刪除行canvas.rotate(...)子視圖的變化繪製正確(例如,這是一個進度條,它是經常更新自己。)

我希望有人可以幫助! 非常感謝。 Chris

回答

0

我認爲動態改變Gui不會更新屏幕。在任何Gui框架中,他們都需要程序員手動請求重繪。

這是因爲如果我在我的Gui中更改10個項目,我不想重繪10次,但只有一次在最後。而且框架無法猜測我什麼時候重構了Gui。所以我需要明確地調用刷新方法。

或者,您可以在完成旋轉東西時直接使您的Gui無效,而不是在單獨的線程中。

+0

好吧,我明白你的意思了。但爲什麼然後視圖被正確繪製(與所有子視圖更新)而不進行旋轉? 我試圖在旋轉畫布後立即使視圖無效。這也工作得很好。但是我已經在另一個論壇上看到,從dispatchDraw()中調用invalidate()並不是一個好主意,因爲invalite()本身會導致dispatchDraw()被執行 - 但我不確定這是否正確。 – 2011-05-10 14:25:21

+0

我不確定你到底在做什麼,但我可以告訴你,Gui有兩種變化。正常的變化:例如,如果您滾動,滾動條必須移動。異常變化:我刪除一個按鈕並添加一個文本視圖。正常的更改將自動反映在屏幕上,因爲它是框架功能的一部分。異常更改是您決定用作程序員的高級函數,而您需要手動刷新Gui。對於你的調度問題,也許你可以嘗試在調度方法之外移動旋轉代碼。 – Joel 2011-05-10 14:33:00