Android开发中的性能优化---布局

须知少年凌云志,曾许人间第一流。这篇文章主要讲述Android开发中的性能优化---布局相关的知识,希望能为你提供帮助。
1.基础android中所有的View都是“画”在手机屏幕上的,系统是每隔16ms更新一次Activity中的内容,所以为了让用户看不到卡顿,就要想尽一切方法来让界面在16ms内更改完成,遵循的原则其实只有一个-----尽量的少画东西,这样效率当然就会提高,至于什么减少布局层次,避免重复绘制,总结下来还是尽量少画东西。 
 
为什么是16ms?因为现在市面上的手机一般都是60hz的,所以  16ms/ 帧 ≈ 1s / 60hz
  2.方法使用手机中的开发人员工具---> 调试GPU过度绘制,使用这个工具来检测布局层次再好不过 

Android开发中的性能优化---布局

文章图片
 
颜色当然是越浅越好,能显示出View的自己的颜色,那么是最理想的状况 
 

2.1 window的background【Android开发中的性能优化---布局】window的background属性,是在每个主题中默认就有的,但是在实际开发中,基本上每个界面的背景色都是特别设置的,并且都会覆盖整个屏幕,所以还不如直接取消掉它 
另外,这也是解决app冷启动缓慢的一种不错方式,最早的办法是将窗体背景设置为了透明,也就是当用户点击app时,由于窗体背景是透明的,就会将启动的缓慢给归咎于Android系统,这让Android系统无缘无故背了很多黑锅,现在解决冷启动的最好方法就是设置一张图片,就像正常的启动页一样,这样就给用户了一种视觉上秒开的错觉。 
 
Ps: 
虽然Android是比较慢,但你拿个一两千的手机和人家ios五六千的比?搞笑 
Android开发中的性能优化---布局

文章图片
 

2.2 选择最佳的布局方式Android虽然有5大常用布局(Google后续又添加了GridLayoutFlexboxLayoutPercentRelativeLayout等),但最为常用的莫过于LinearLayoutRelativeLayout 
每一个ViewGrounp基本都会在onMeasure方法中测量出子View的大小,一般情况下LinearLayout的测量效率会高于RelativeLayout,因为LinearLayout的测量次数少,而由于RelativeLayout布局的相对性,所以它的测量次数比较多,毕竟有一种可能是viewA 在横向上依赖于viewB,而viewB在纵向上依赖于viewA 
Android开发中的性能优化---布局

文章图片

 
所以,在一般情况下,最好使用LinearLayout 
既然有一般情况,那么就有二般的情况@[email  protected]!,就是LinearLayout布局中使用weight权重来进行布局,这样会增加LinearLayout的测量次数,让它和RelativeLayout处于同一起跑线上,但是众所周知的是,很多时候都需要用到weight属性来进行万恶的屏幕适配,那么问题来了,到底怎么选择? 
我个人衡量标准: 
1.当包括父View在内有3层嵌套的情况下,就会考虑RelativeLayout,当不包括父View就嵌套了3层的情况下,我肯定会优先选择RelativeLayout。 
2.对于不是简单到极致的ListViewRecyclerView,我基本上会选择RelativeLayout来一层解决。 

2.3 去掉完全不可能使用的属性资源开发时候通常在布局时,就会给View设置一些数据来进行布局参考,比如说为text设置一些文字、给srcbackground设置一些资源或图片(特别是图片),但当程序运行后,这些东西99%不会用到,但是Android系统仍然会傻乎乎的加载这些东西,所以,就不要布局中为这些属性赋值 
Android开发中的性能优化---布局

文章图片

 
但是有个问题, 
如果不赋值,很多人写布局没有了数据参考会很不习惯,比如设置文字的大小,如果赋值就会影响效率,总不能运行时再一个个删除,这样万一运行后效果不理想就还要再一个个加上去, 
所以google为此提供了tools,在该命名空间下的属性,只会在布局页面中显示,而不会在程序运行时加载 
Android开发中的性能优化---布局

文章图片

 
还有一种情况是去掉完全被遮挡的属性,比如下面这张图片中的ImageView的图片遮挡住了LinearLayout的部分背景色,这种情况就不要给布局设置整体背景色了,单独设置给ListView或者它的item即可(不要以为看不到Android就不会画,Android如果有这么聪明,还要程序员干嘛?) 
Android开发中的性能优化---布局

文章图片


2.4 Margin和Padding这部分属于个人猜想,paddingmargin在有时候的效果是一模一样的,但是哪个效率更高?我觉得是padding,因为‘margin‘的属性全名是layout_margin,是由父View来决定,这样是不是会影响父View测量子View的速度? 
































    推荐阅读