2012-05-18 31 views
26

我對this question的回答剛剛被接受,但我開始懷疑究竟是什麼時候需要使視圖無效()而視圖沒有必要?何時需要在View上執行invalidate()?

後一點思考我來實現它應該工作或多或少是這樣的:

  • 的「一切」實際繪圖發生後onResume()
  • 中的「自由」時間部分
  • 屏幕可以重繪,但只有那些被invalidated(和下面的一切)

因此,它似乎是,如果我後改變一些東西(例如作爲對按鈕點擊的迴應,我應該invalidate()更改爲View)。

但是,從this question中的scana中可以看出,它必須更復雜一些,它取決於某些方法使用的方法。

E.g.一個人是否使用

lastClicked.setImageBitmap(); 

lastClicked.setImageResource(); 

所以,當有必要在一個視圖下執行無效(),它是如何真的有效嗎?

回答

13

通常,系統會自動處理調整大小,隱藏,顯示和其他大量其他內容如果繪製像素或後備數據的基礎緩衝區已更改或陳舊(您交換View上的圖像資源或原始數據集更改),則它有時會出現問題。發生這種情況的原因是操作系統無法知道數據是以特定方式更改的。

在這種情況下,你正在處理的圖紙,你必須告訴其底層的數據是不符合Widget.invalidate(良好的狀態的系統)和重畫被排隊的主線程只是如你所說。根據系統實現和Android版本,跟蹤系統更改的內容會有所不同,但我通常所做的是假定系統資源(字節數組,字符數組,資源索引,上下文的手動繪圖)未被跟蹤,並且需要一個無效和其他一切將由系統處理。

+0

一些更正句子,但錯誤的方法。 -1 – ncm

54

(不要考慮接受一些答案)

一般來說,invalidate()手段和結果「的屏幕重繪」到視圖的onDraw()方法的調用。所以如果有什麼變化,需要在屏幕上反映出來,你需要撥打invalidate()。但是,對於內置小部件,您很少需要自己調用它。當您更改小部件的狀態時,內部代碼將根據需要調用invalidate(),您的更改將反映在屏幕上。例如,如果您撥打TextView.setText(),在進行了大量內部處理後(文本是否適合屏幕,是否需要橢圓化等),TextView將在setText()返回之前調用invalidate()。對於其他小部件也是如此。

如果您實現自定義視圖,則只要支持模型發生更改並需要重繪視圖,就需要調用invalidate()。它也可以用來創建簡單的動畫,在那裏你改變狀態,然後調用invalidate(),再次更改狀態等。

+1

要完成這個答案我想說很多時間是很重要的,以檢查您可能使用的小部件的各種方法的代碼,以瞭解何時有無效呼叫並實施佈局,以儘量減少它們。 例如,如果你有一個複雜的佈局,一個帶有wrap_content的TextView將始終invalide()所有你的佈局每一次調用setText()的結束,另一端如果你設法得到一個固定的維度,該視圖將隨着更流暢的GUI而改變。 –

0

請記住,在屏幕上繪圖是一個頻繁的過程,無論何時更新視圖,都應該傳播和重繪該更改以通知此類更改。 invalidate()是一個觸發器方法,它表示強制重繪任何您希望顯示更改的視圖。