Android布局优化

1.要减少布局嵌套:

  复杂布局可以使用RelativeLayout或者GridLayout搞定;如果是简单布局则使用ViewGroup的使用优先级:FrameLayout>LinearLayut>RelativeLayout;对于自动换行的ViewGroup可以选择自定义布局。(个人写的自动换行布局:https://github.com/divaid/MyTest/blob/master/app/src/main/java/com/david/mytest/test/day_6_27_autolinetest/AutoLineView.java

2.减少过度绘制:

  对于背景色的设置,如果父布局设置了背景色,子布局尽量不要设置,因为会导致背景色的重绘。

3.检测工具:

  查看是否过度绘制可以通过开发者选项的过度绘制查看,选择显示过度绘制区域即可。
这里写图片描述
具体解释:布局蓝色部分表示只绘制了一次,绿色表示绘制了两次,粉红表示绘制了三次,深红绘制了四次及以上。
绘制一两次还好,如果绘制了多次的话就要优化下布局了否则会影响测量绘制时间具体可通过开发者选项的GPU呈现模式分析中的条形显示图查看绘制情况:
这里写图片描述
具体解释:
(1). 绿色水平线代表16ms,要确保一秒内打到60fps,你需要确保这些帧的每一条线都在绿色的16ms标记线之下.任何时候你看到一个竖线超过了绿色的标记现,你就会看到你的动画有卡顿现象产生.
(2). 蓝色代表测量绘制的时间,或者说它代表需要多长时间去创建和更新你的DisplayList.在Android中,一个视图在可以实际的进行渲染之前,它必须被转换成GPU所熟悉的格式,简单来说就是几条绘图命令,复杂点的可能是你的自定义的View嵌入了自定义的Path. 一旦完成,结果会作为一个DisplayList对象被系统送入缓存,蓝色就是记录了需要花费多长时间在屏幕上更新视图(说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的Display List对象).当你看到蓝色的线很高的时候,有可能是因为你的一堆视图突然变得无效了(即需要重新绘制),或者你的几个自定义视图的onDraw函数过于复杂.
(3). 红色代表执行的时间,这部分是Android进行2D渲染 Display List的时间,为了绘制到屏幕上,Android需要使用OpenGl ES的API接口来绘制Display List.这些API有效地将数据发送到GPU,最总在屏幕上显示出来.
(4). 橙色部分表示的是处理时间,或者说是CPU告诉GPU渲染一帧的时间,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复,如果柱状图很高,那就意味着你给GPU太多的工作,太多的负责视图需要OpenGL命令去绘制和处理.

以上是比较简单直观的检测方法,其他的一些检测工具可以看下这位大神的博客:http://blog.csdn.net/wangbaochu/article/details/50396512

ps:
这里写图片描述
对于类似这样的布局可以直接使用自定义布局,因为重用的地方比较多,因此造一次轮子就行了:https://github.com/divaid/MyTest/blob/master/app/src/main/java/com/david/mytest/ui/common/IconLabelTetView.java

猜你喜欢

转载自blog.csdn.net/divaid/article/details/74909000