2012-03-11 259 views
3

我想在我的ListView上繪製一個疊加層。所以我採用了最明顯的方法,並將我的自定義繪圖代碼放在我的ListView子類的super.onDraw(canvas)下面。自定義列表視圖圖

令我驚訝的是,該列表呈現在我的自定義繪圖之上。我知道這很容易通過將ListView包裝在FrameLayout中完成,但我認爲膨脹另一個視圖並不是必須的。一個修復和解釋爲什麼我遇到這個問題將是真棒,謝謝!

我抽獎代碼看起來是這樣的:

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawRect(rect, paint); 
} 

回答

6

有關ListView控件的事情是,它不是實際繪製列表內容。這由綁定到列表的Adapter處理 - 或者更具體地說,由該Adapter填充ListView創建的視圖。

ListView的onDraw發生在包含的視圖被創建和顯示之前。

在ListView之上繪製東西可能很昂貴,因爲您正在合成已經複雜的View上的另一個圖層。將另一個視圖置於頂部(根據您的建議使用FrameLayout)可能是您嘗試做什麼的「最佳」方式,或者(取決於您嘗試實現的效果),您可以修改適配器或視圖顯示您要覆蓋的數據。

4

重寫dispatchDraw而不是onDraw似乎做你想要什麼:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 
    ... 
} 
+0

這就是我一直在尋找! – themarshal 2015-11-09 21:41:42