1、保持view的树形结构尽量扁平
一个页面绘制出来,先需要通过测量 layout树的结构,从父节点测量直到每一个子节点,确定每一个view要在view中显示的位置和大小,测量完了之后再绘制。在一个页面上拥有的view越多,measure、layout、draw所花费的时间就越久。要缩短这个时间,关键是保持view的树形结构尽量扁平,而且要移除所有不需要的渲染view。一般情况下绘制复杂的布局时使用relative layout,这样可以减少view的层级。当然最好是使用constraint layout。
2、Merge
要想灵活布局少不了一些细节上的东西,比如Merge标签。
详细可参考:
http://blog.csdn.net/xiaoyinliuyun/article/details/73480444
merge标签用在include文件中,其根控件的布局与include的父布局的布局方式相同,避免多次写入布局方式。
3、ViewStub
ViewStub是一个非常轻量的控件,通常在include一个布局文件的时候,可以通过ViewStub加载一个布局文件,而且当这个布局文件需要动态显示和隐藏的时候,用ViewStub来加载就很有优势了。需要注意的ViewStub不能与Merge混合使用。ViewStub一开始在界面上并不会加载,可以通过代码viewStub.setVisibility(View.VISIBLE);或者View inflateView = viewStub.inflate();来加载显示,与view.Gone不同的是,ViewStub一开始是不会渲染的,但是View.Gone会渲染。
详细可参考:
https://www.jianshu.com/p/5f64bacbd759
4、推荐使用 FrameLayout,LinearLayout、RelativeLayout 次之。
5、真机调试的时候可以打开调试CPU过度绘制图或者或者将view显示调试为“显示为条形图”来查看view绘制情况。
1)设置->开发者选项->调试GPU过度绘制
-
结果显示如下:
1)设置->开发者选项->GPU呈现模式分析
2) 结果显示如下:
过度绘制的各种颜色都代表了什么:
造成过度优化的关键是什么? 多余的背景(Background)
6、RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View2次onMeasure。
7、RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。
对布局的优化可以从以下几个方面入手:
1、检查布局的background属性,看看有没有重叠现象
2、尽量降低布局嵌套层次
3、合理使用include、merge、ViewStub等标签
4、删除冗余的资源