布局优化
1.Android UI渲染机制
Android 中,系统通过VSYNC信号触发对UI的绘制、重绘,期间的间隔是16ms。
Android 中的提供了UI检查工具:开发者选项:GPU 呈现模式分析(Profile GPU Rendering)
选中 ,在屏幕上显示条形图(On Srcreen as bar)选项,屏幕上会出现一些条形图。
每一个条形图都包括3部分。
黄色:代表测量绘制Display List 时间
红色:代表CPU等待CPU处理时间。
中间的绿色横线代表VSYNC时间16ms,需要尽量将所有条形图都控制在这条绿线之下。
2.避免Overdraw
Overdraw,过度绘制会浪费很多GPU,CPU资源。
开发者选项也提供了一个工具:本机上显示是 :调试GPU过度绘制(Enable GPU Overdraw)
通过工具可以查看当前区域中的绘制次数,从而尽量优化绘图层次,尽量增大蓝色的区域,
减少红色的区域。
3.优化布局中的层级
在Android中,系统对View进行测量,布局和绘制时,都是通过对View数的遍历来进行的操作的。
如果一个View 树的高度太高,就会严重影响测量、布局和绘制速度,因此优化布局的第一个方法
就是降低View树的高度,Google也在其API文档中建议View树高度不宜超过10层。默认新建的布局根
布局使用的RelativeLayout来代替LineraLayout就是通过扁平的RelativeLayout来降低LineraLayout嵌套
所产生的布局树的高度,从而提高UI渲染的效率。
4.避免嵌套过多的无用布局。
5.使用标签来重用布局
为了能够在不同的Layout组件中石油共同的UI,不要在共同的UI中写太多的只有某个特定组件才有的属性。
6.使用 实现View的延迟加载
是一个轻量级的组件,不可视,大小为0。
ViewStub 中的其它布局:必须通过: android:layout=”@layout/subview”来引入。
不然报错下面的错误
java.lang.ClassCastException: android.view.ViewStub cannot be cast to android.view.ViewGroup
获取: mViewStub = (ViewStub) findViewById(R.id.viewsub);
显示: A: mViewStub.setVisibility(View.VISIBLE);
B:inflate inflateView = mViewStub.inflate();
inflate 可以返回引用的布局,从而使用 findViewById找到内部空间。
一旦ViewStub被设置为可见或者inflate ViewStub就不存在了,取而代之的是被inflate的Layout,
并将这个Layout的ID重新设置为中通过android:infaltedId属性所指定的Id,调用两次
会报ViewStub must have a non-null ViewGroup viewParent 错误。
ViewStub 与 View.GONE 的区别:
相同点:初始时都不显示。
区别:ViewStub 只有显示时才会渲染布局,而View.GONE 在初始化布局树的时候已经添加到布局树上了。
相比之下ViewStub效率更高。
7.Hierarchy View
Hierarchy View 是一个优化布局强大的工具。工具位置:android-sdk\tools
为了Hierarchy View能够在真机上运行 可以使用开源库:
ViewServer地址
https://github.com/romainguy/ViewServer
点击View 显示时间NA 点击Profile Node 按钮重新计算,知道绘制时长后,系统会在下方给出3个不同
颜色的小圆点,表示绘制效率,绿、黄、红 分别代表好、中、差。
更多使用技巧请查看官网指南地址:https://developer.android.google.cn/studio/profile/optimize-ui.html
demo下载地址(包含ViewStub 和ViewServer使用)