2012-08-11 27 views
21

我把一個Log.d()調用放到我的擴展視圖的onDraw()中,所以我可以看到它被調用的頻率和時間。它被稱爲視圖的實例化,這並不奇怪。但後來我注意到,即使我的代碼沒有做任何與圖形相關的任何事情,它也會在onTouchEvent()處理的每個tap上調用。然而,在Views的documentation中,我似乎無法找到什麼時候onDraw()被實際調用。我並不關心我在這裏的特定項目(這對我來說不會造成問題),我只想知道某處是否有列表或顯示View的操作順序的內容,尤其是什麼原因onDraw()被調用。當View.onDraw()---它何時被調用?

回答

45

據我所知,一個視圖的OnDraw()被調用:

  1. 該視圖最初繪製
  2. 每當invalidate()被稱爲視圖上

失效等可能由您或叫系統,只要需要。例如,很多Views會改變它們在Touch上的外觀,就像EditText獲取輪廓和光標,或者處於按下狀態的按鈕一樣。因此,視圖會重新繪製。

我同意擁有一份詳細介紹視圖工作的文檔,如果存在並且有人知道在哪裏可以找到它,請告訴我們。

+0

這不適用於'ViewGroup's。請參閱我的答案http ://stackoverflow.com/a/34367199/1642079 – 2016-10-25 17:52:54

7
  • 如果你設置背景繪製的視圖,然後在視圖將提請 爲你回電話給其的onDraw()方法之前。

  • onAttachedToWindow()在視圖附加到窗口時調用。 在這一點上它有一個表面,並將開始繪製。請注意,這個 函數保證在 onDraw(android.graphics.Canvas)之前被調用,但是它可以在第一個onDraw之前 - 包括onMeasure之前或之後(int, int)之前的任何時間被調用 。

  • invalidate()將dirty定義的區域標記爲需要繪製。如果 視圖可見,onDraw(android.graphics.Canvas)將在 未來的某個點調用。要牢記

+0

是我們可以攔截之前調用回onDraw(),你想檢查我的問題http://stackoverflow.com/questions/19052952/bitmap-change-will - 製作 - 視圖 - 自動刷新前方的OnDraw中和 - 不管-無效 – VinceStyling 2013-09-28 06:57:51

1

一個重要的事情是,儘量不帶參數減少無效()函數調用的。 而是嘗試使用四個參數來最大化invalidate()函數。由於整個視圖的繪製非常昂貴。第二個變體僅刷新視圖的一部分。

8

onDraw()在調用invalidate()時被調用。

但是你應該知道對於ViewGroups:onDraw()不會像你期望的那樣被稱爲。相反,onDispatchDraw()

但是,在ViewGroup中,您可以在構造函數中調用setWillNotDraw(false)以使onDraw()invalidate()上被調用。

看一看this answer

0

附加於上述:軟鍵盤導致View.invalidate() - > View.onDraw()調整窗口大小後序列明智地容納「鍵盤」 。自定義View.onDraw()必須使自己處於預期這種可能性的狀態。
這種現象解釋了爲什麼在藍牙鍵盤的平板電腦上開發和測試的應用程序一旦到達真實世界就會轉到狗身上( - :

相關問題