码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2018-02-05 21:52:15      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:简单   nbsp   资源   ext   颜色   命名空间   相对   oid   .com   

1.基础

  Android中所有的View都是“画”在手机屏幕上的,系统是每隔16ms更新一次Activity中的内容,所以为了让用户看不到卡顿,就要想尽一切方法来让界面在16ms内更改完成,遵循的原则其实只有一个-----尽量的少画东西,这样效率当然就会提高,至于什么减少布局层次,避免重复绘制,总结下来还是尽量少画东西。 
   
  为什么是16ms?因为现在市面上的手机一般都是60hz的,所以 16ms/ 帧 ≈ 1s / 60hz

 

2.方法

  使用手机中的开发人员工具--->调试GPU过度绘制,使用这个工具来检测布局层次再好不过 
技术分享图片 
  颜色当然是越浅越好,能显示出View的自己的颜色,那么是最理想的状况 
   
  

2.1 window的background

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

2.2 选择最佳的布局方式

  Android虽然有5大常用布局(Google后续又添加了GridLayoutFlexboxLayoutPercentRelativeLayout等),但最为常用的莫过于LinearLayoutRelativeLayout 
  每一个ViewGrounp基本都会在onMeasure方法中测量出子View的大小,一般情况下LinearLayout的测量效率会高于RelativeLayout,因为LinearLayout的测量次数少,而由于RelativeLayout布局的相对性,所以它的测量次数比较多,毕竟有一种可能是viewA 在横向上依赖于viewB,而viewB在纵向上依赖于viewA 
  技术分享图片
   
  所以,在一般情况下,最好使用LinearLayout 
  既然有一般情况,那么就有二般的情况@_@!,就是LinearLayout布局中使用weight权重来进行布局,这样会增加LinearLayout的测量次数,让它和RelativeLayout处于同一起跑线上,但是众所周知的是,很多时候都需要用到weight属性来进行万恶的屏幕适配,那么问题来了,到底怎么选择? 
  我个人衡量标准: 
  1.当包括父View在内有3层嵌套的情况下,就会考虑RelativeLayout,当不包括父View就嵌套了3层的情况下,我肯定会优先选择RelativeLayout。 
  2.对于不是简单到极致的ListViewRecyclerView,我基本上会选择RelativeLayout来一层解决。 
  

2.3 去掉完全不可能使用的属性资源

  开发时候通常在布局时,就会给View设置一些数据来进行布局参考,比如说为text设置一些文字、给srcbackground设置一些资源或图片(特别是图片),但当程序运行后,这些东西99%不会用到,但是Android系统仍然会傻乎乎的加载这些东西,所以,就不要布局中为这些属性赋值 
  技术分享图片
   
  但是有个问题, 
    如果不赋值,很多人写布局没有了数据参考会很不习惯,比如设置文字的大小,如果赋值就会影响效率,总不能运行时再一个个删除,这样万一运行后效果不理想就还要再一个个加上去, 
    所以google为此提供了tools,在该命名空间下的属性,只会在布局页面中显示,而不会在程序运行时加载 
  技术分享图片
   
  还有一种情况是去掉完全被遮挡的属性,比如下面这张图片中的ImageView的图片遮挡住了LinearLayout的部分背景色,这种情况就不要给布局设置整体背景色了,单独设置给ListView或者它的item即可(不要以为看不到Android就不会画,Android如果有这么聪明,还要程序员干嘛?) 
  技术分享图片
  

2.4 Margin和Padding

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

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

标签:简单   nbsp   资源   ext   颜色   命名空间   相对   oid   .com   

原文地址:https://www.cnblogs.com/sweep/p/8419117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!