性能優(yōu)化之布局優(yōu)化記錄

gpu繪制

做開(kāi)發(fā)時(shí)間長(zhǎng)了之后,收集后臺(tái)的bug,發(fā)現(xiàn)很多都是OOM(Out Of Memory Killer)。性能優(yōu)化這時(shí)候成為了重點(diǎn),下面是自己項(xiàng)目中布局優(yōu)化的記錄,希望對(duì)大家有所幫助。

父布局

  • 對(duì)于ViewGroup的選擇問(wèn)題:推薦FrameLayout > LinearLayout > RelativeLayout(為了優(yōu)化布局,RelativeLayout會(huì)調(diào)用childrenView 的onMeasure()兩次),推薦閱讀:LinearLayout與RelativeLayout的性能比較
  • 盡量不要嵌套使用RelativeLayout.
  • 盡量不要在嵌套的LinearLayout中都使用weight屬性.
  • 避免使用多重布局嵌套,層級(jí)能少就少
  • 善用TextView的Drawable減少布局層級(jí)

背景色

  • 去掉多余的布局背景色,比如ScrollView包裹的內(nèi)容分為兩段,第一段使用的是match_parent的寬,第二段是文字,只需要給文字部分加背景,則背景色屬性就放在文字部分的節(jié)點(diǎn)屬性里。
  • RecyclerView及ViewPager等外部容器最好不要使用背景色,如果內(nèi)容有背景色會(huì)導(dǎo)致重疊
  • selector可使用系統(tǒng)自帶的點(diǎn)擊效果android:background="?attr/selectableItemBackground",因?yàn)槌跏贾禐橥该魃?,不?huì)重繪。如果需要使用對(duì)應(yīng)的高亮色來(lái)作為ripple的背景色,那么就需要在styles-v21里面加這個(gè)加入:
    <item name = "android:colorControlHighlight">@color/colorAccent</item>
  • 注:Navigation的background會(huì)影響4.4系統(tǒng)的狀態(tài)欄
  • CardView會(huì)自動(dòng)加一層背景色
  • ripple里的默認(rèn)顏色為<item>標(biāo)簽下設(shè)置,如果設(shè)置多個(gè)重復(fù)的<item>會(huì)導(dǎo)致多重繪制。
  • ripple里如要設(shè)置默認(rèn)色為透明色,因?yàn)樵O(shè)置透明色不會(huì)導(dǎo)致重新繪制。直接設(shè)置color="@android:color/transparent"點(diǎn)擊會(huì)沒(méi)有效果,加上一個(gè)掩碼<item android:id="@android:id/mask">就好了
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
  android:color="@color/itemBackground">
  <item android:id="@android:id/mask">
      <color android:color="@android:color/white" />
  </item>
</ripple> 

Mask層(Mask Layer):
可以設(shè)置指定子層item的android:id="@android:id/mask"來(lái)設(shè)定當(dāng)前Ripple的Mask。
Mask的內(nèi)容并不會(huì)被繪制到屏幕上,它的作用是限定Ripple效果的繪制區(qū)域。
mask所在的的子層限制了Ripple效果的最大范圍只能是View的邊界,不會(huì)擴(kuò)散到父組件。

布局優(yōu)化標(biāo)簽

1、<include>:常用于將布局中的公共部分提取出來(lái)供其他layout共用,以實(shí)現(xiàn)布局模塊化,這在布局編寫(xiě)方便提供了大大的便利。

2、<viewstub>:viewstub標(biāo)簽同include標(biāo)簽一樣可以用來(lái)引入一個(gè)外部布局,不同的是,viewstub引入的布局默認(rèn)不會(huì)擴(kuò)張,即既不會(huì)占用顯示也不會(huì)占用位置,從而在解析layout時(shí)節(jié)省cpu和內(nèi)存。
viewstub常用來(lái)引入那些默認(rèn)不會(huì)顯示,只在特殊情況下顯示的布局,如進(jìn)度布局、網(wǎng)絡(luò)失敗顯示的刷新布局、信息出錯(cuò)出現(xiàn)的提示布局等。
比較直觀的感覺(jué)是:在設(shè)置里打開(kāi)顯示布局邊界后,如果不是使用<viewstub>標(biāo)簽,GONE掉后,加載中的布局還是會(huì)有顏色顯示,而使用了此標(biāo)簽后顏色會(huì)消失。

使用前 使用后

3、<merge>:在使用了include后可能導(dǎo)致布局嵌套過(guò)多,多余不必要的layout節(jié)點(diǎn),從而導(dǎo)致解析變慢,不必要的節(jié)點(diǎn)和嵌套可通過(guò)hierarchy viewer(下面布局調(diào)優(yōu)工具中有具體介紹)或設(shè)置->開(kāi)發(fā)者選項(xiàng)->顯示布局邊界查看。

優(yōu)化工具

1、GPU過(guò)渡繪制:Graphic Processing Unit

位置:設(shè)置/選擇開(kāi)發(fā)選項(xiàng)(Developer Options)/調(diào)試GPU 過(guò)度繪制(Debug GPU Overdraw),然后選擇“顯示過(guò)度繪制區(qū)域(Show overdraw area)”。

定義:指在屏幕上的一個(gè)像素在單個(gè)幀中被重繪了多次。可以通過(guò)手機(jī)設(shè)置/開(kāi)發(fā)者選項(xiàng)/調(diào)試GPU過(guò)渡繪制/,不同的顏色顯示了渲染過(guò)渡程度


手機(jī)gpu繪制

2、Hierarchy Viewer
3、Lint tool

優(yōu)化結(jié)果

優(yōu)化前 優(yōu)化后

對(duì)應(yīng)項(xiàng)目:CloudReader

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容