問題
我們知道過多的布局嵌套對View的繪制速度是有一定影響的,多一層嵌套意味著至少多走一次繪制流程,所以開發過程中一般都會特別注意layout層級的問題。針對xml往往可以使用ConstraintLayout替換以往的四大布局,但針對自定義ViewGroup卻很少有開發者關注其是否有多余的布局嵌套。
粗略看了小紅書二十幾個自定義ViewGroup,發現全部均有多余的布局嵌套問題,無一例外!所以建議小紅書在這個方面可以著重優化一下!
如下案例:
如上圖,自定義ViewGroup? BeautySettingView繼承自LinearLayout,然后直接通過inflate將xml添加為自身的子布局,這樣會導致多了一層LinearLayout的嵌套,布局層次如下關系:
- BeautySettingView? ?(自定義ViewGroup)
? ? - LinearLayout? (從xml加載的布局)
? ? ? ? - com.xingin.alpha.emcee.beautify.NoBeautyView
? ? ? ? - View
? ? ? ? - android.recyclerview.widget.RecyclerView
理想的方案是優化成如下關系:
- BeautySettingView???(自定義ViewGroup)? ??
? ? - com.xingin.alpha.emcee.beautify.NoBeautyView
????- View? ? ? ??
????- android.recyclerview.widget.RecyclerView
優化方案
按照我經驗,最好的方案是:xml使用merge標簽
步驟如下:
1.xml布局的根節點使用merge;
2.merge節點通過指定屬性tools:parentTag="android.widget.LinearLayout"進行布局預覽
3.在自定義ViewGroup中重新設置相關布局屬性(ps:因為merge標簽上的屬性通過inflate是無效的,這一點非常需要注意)
根據以上步驟,重新修改BeautySettingView