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后续又添加了GridLayout
、FlexboxLayout
和PercentRelativeLayout
等),但最为常用的莫过于LinearLayout
和RelativeLayout
每一个ViewGrounp
基本都会在onMeasure
方法中测量出子View的大小,一般情况下LinearLayout
的测量效率会高于RelativeLayout
,因为LinearLayout
的测量次数少,而由于RelativeLayout
布局的相对性,所以它的测量次数比较多,毕竟有一种可能是viewA 在横向上依赖于viewB,而viewB在纵向上依赖于viewA
所以,在一般情况下,最好使用LinearLayout
既然有一般情况,那么就有二般的情况@[email protected]!,就是LinearLayout
布局中使用weight
权重来进行布局,这样会增加LinearLayout
的测量次数,让它和RelativeLayout
处于同一起跑线上,但是众所周知的是,很多时候都需要用到weight
属性来进行万恶的屏幕适配,那么问题来了,到底怎么选择?
我个人衡量标准:
1.当包括父View在内有3层嵌套的情况下,就会考虑RelativeLayout
,当不包括父View就嵌套了3层的情况下,我肯定会优先选择RelativeLayout
。
2.对于不是简单到极致的ListView
或RecyclerView
,我基本上会选择RelativeLayout
来一层解决。
2.3 去掉完全不可能使用的属性资源
开发时候通常在布局时,就会给View
设置一些数据来进行布局参考,比如说为text
设置一些文字、给src
或background
设置一些资源或图片(特别是图片),但当程序运行后,这些东西99%不会用到,但是Android系统仍然会傻乎乎的加载这些东西,所以,就不要布局中为这些属性赋值
但是有个问题,
如果不赋值,很多人写布局没有了数据参考会很不习惯,比如设置文字的大小,如果赋值就会影响效率,总不能运行时再一个个删除,这样万一运行后效果不理想就还要再一个个加上去,
所以google为此提供了tools
,在该命名空间下的属性,只会在布局页面中显示,而不会在程序运行时加载
还有一种情况是去掉完全被遮挡的属性,比如下面这张图片中的ImageView
的图片遮挡住了LinearLayout
的部分背景色,这种情况就不要给布局设置整体背景色了,单独设置给ListView
或者它的item
即可(不要以为看不到Android就不会画,Android如果有这么聪明,还要程序员干嘛?)
2.4 Margin和Padding
这部分属于个人猜想,padding
和margin
在有时候的效果是一模一样的,但是哪个效率更高?我觉得是padding
,因为‘margin‘的属性全名是layout_margin
,是由父View来决定,这样是不是会影响父View测量子View的速度?