過度繪製的小筆記

第一次寫博客,好多規則還不懂,就當是自己的筆記了。
如果給一個佈局繪製了重疊的背景,那麼默認Activity的背景就屬於無效的過度繪製,即overdraw。

怎麼來看我們做的app有沒有過度繪製呢?

安裝好apk後,打開手機的設置,然後打開開發者選項,調試GPU過度繪製。
你會看到手機上有五種顏色:
沒有顏色:沒有overdraw,同一地方的像素點只繪製了一次。
藍色:overdraw1倍,同一地方的像素點繪製了兩次,大片的藍色可以接受(如果整個窗口是藍色,可以考慮拜託一層,或者看看自己有沒有把系統繪製的給去掉)。
綠色:overdraw2倍,同一地方的像素點繪製了三次,中等大小的區域可以接受,但是儘可能的進行優化。
淺紅:overdraw3倍,同一地方的像素點繪製了四次,小範圍的可以接受。
暗紅:overdraw4倍,同一地方的像素點繪製了五次或者更多,講道理這是要修復的,但是我發現好多app都有暗紅色區域,包括網易音樂、扣扣。

怎麼避免過度繪製呢

1:如果一個佈局需要多個LinearLayout嵌套才能完成,這個時候我們就要考慮使用RelativeLayout來代替了。
2:儘可能的減少View樹的層數,多使用標籤,該標籤一般是和標籤一塊使用,減少佈局的層級。比如說:如果當前的佈局是一個豎直方向的linearLayout設置了背景,而且包含的佈局文件也是豎直方向也設置了相同背景,那麼這個時候被包含的佈局文件是多餘的,也是的用武之地了。
3:有的時候我們使用imageview的時候,通常會給該控件設置默認圖片,那麼建議不要在background屬性上設置,因爲我們在給imageview設置應有的圖片的時候不是在這個屬性上設置的。
4:如果不用系統的背景,移除Window默認的Background(getWidow.setBackgroundDrawable(null);),要在setContentView方法之後調用。如果我們的佈局文件中多餘的背景也要去掉,包括顏色背景。
5:對於不常用的佈局,建議使用viewstub,因爲它比較輕量級(寬和高都是0),本身不參與任何佈局個繪製過程。可以按需加載所需的佈局文件,也就是我們什麼時候想讓該佈局文件出現了,調用viewstub的inflate方法,viewstub纔會初始化,然後我們findviewbyid創建viewstub所指的對象。使用比如:網絡異常的界面。
6:每一個window對應一個view和一個viewrootimpl,也對應一個canvas,window下的所有視圖(view、viewgroup)使用的是同一個canvas,視圖樹的父節點在調用子視圖的draw方法之前會對canvas進行裁切,裁切的區域就是view的矩形區域。這也就是爲什麼超過view邊界的內容會被裁掉的原因。我們可以利用調用canvas.clipRect()對多餘的、重疊並且帶背景的View進行裁切。

發佈了32 篇原創文章 · 獲贊 7 · 訪問量 4920
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章