2012-12-19 52 views
2

起初,我創建了一個自定義視圖,通過覆蓋onDraw()方法來吸引自己。由於我需要創建大量的觀點,這變得不切實際。所以我創建了一個自定義ViewGroup,它使用onLayout()方法繪製它的每個子對象。自定義ViewGroup中的自定義視圖應該使用onDraw()還是layout()?

我讀過android文檔中的子視圖應該實現layout()方法。但是我所做的子視圖使用onDraw方法來繪製自己。我該如何處理?我應該擺脫onDraw()方法嗎?誰能給我一個例子,說明layout()方法的工作原理以及如何將我的onDraw()方法「轉換」爲layout()方法?

我目前onDraw()方法是這樣的:

protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 

     //Draw Border. 
     canvas.drawRect(mCellBounds, mBorderPaint); 

     //Draw Background. 
     canvas.drawRect(mBackgroundBounds, mBackGroundPaint); 

     //Draw Value if not 0. 
     if(Value != 0) 
      canvas.drawText(Integer.toString(Value), ValueX, ValueY, mNumberPaint); 

     //Draw Notes if Value == 0. 
     else 
     { 
      for(int i = 0 ; i < 9 ; i++) 
       if(NoteList[i]) 
        canvas.drawText(Integer.toString(i), NoteX + ((i%3) * NoteMeasureX), NoteY + ((i/3) * NoteMeasureY), mNotePaint); 
     } 
    } 

回答

5

所以我創建了一個自定義的ViewGroup,它使用onLayout()方法繪製它的每個子對象 。

我不明白你如何在onLayout方法中繪製ViewGroup的孩子。應該使用該方法將兒童放在屏幕上。

我讀過Android文檔中的子視圖應該 實現佈局()方法

這種方法已經實現,你用正確的價值觀稱之爲所以View就知道了它應該放在屏幕上。

我應該擺脫onDraw()方法嗎?

如果你想實際看到的東西,你不應該忽略onDraw方法。

而且任何人都可以給我如何佈局()方法的工作 一個例子,我應該怎麼「轉換」我的onDraw()方法來佈局()方法?

您不會將onDraw方法轉換爲layout方法。作爲一個例子,我做了一個由定製ViewGroup和一個自定義子View組成的小樣本。它會在下面的圖片放置在兩個(預期的孩子)之類的自定義ViewGroup(每個孩子都會有一半的寬度和家長的高度):

custom ViewGroup

您可以找到樣本here。我希望它能幫助你。 您也可以查看SDK佈局的源代碼(如簡單的FrameLayout),以瞭解它們如何發揮它們的魔力。

1

你真的需要整個視圖層次結構? 考慮使用SurfaceView,這是一種輕鬆實現自定義繪圖的方式,所有視圖都可以輕鬆嵌入到其他視圖中。

另請參閱我的回答here

+0

謝謝,我會考慮這個。但現在,我想了解自定義視圖組是如何工作的,所以這個問題對我很重要。 –

相關問題