问题
我们知道过多的布局嵌套对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