Android中Relativelayout和Linearlayout性能分析
系统源码DecoreView ---> LinearLayout
新建工程默认----> RelativeLayout
View的基本工作原理:
View是Android系统在屏幕上的视觉呈现,也就是说你在手机屏幕上看到的东西都是View.
ViewView绘制流程
View的绘制流程是从ViewRoot的performTraversals()方法开始,依次经过measure(),layout()和draw()三个过程才最终将一个View呈现出来.从ViewRoot的performTraversals()方法开始依次调用perfromMeasure,perfromLayout,perfromDraw这三个方法.其中perfromMeasure会调用measure,measure又会调用onMeasure,在onMeasure方法中则会对所有子元素进行measure,这时候measure流程就从父容器传递到子元素中,这样就完成了measure过程.接着子元素会重复父容器的measure,如此反复就完成了整个View树的遍历.performLayout和performDraw同理如此.
View怎么呈现在页面上
Android中的视图都是通过window来呈现的,不管是Activity,Dialog或者Toast它们都有一个Window,然后通过WindowManager来管理View,Window和顶级View---DecorView的通信都是依赖ViewRoot完成
View和ViewGroup的区别
View是一种界面层控件的抽象
ViewGroup继承View,多个控件组成的控件组
RelativeLayout对比LinearLayout主要慢在onMeasurce上
RelativeLayoutRelativeLayout会对子View做两次measure,因为RelativeLayout允许A,B 2个子View,横向上B依赖A,纵向上A依赖B。所以需要横向纵向分别进行一次排序测量。
LinearLayout只会绘制一次如果不使用Weight,LinearLayout会在当前方向上进行一次measure过程,如果使用了Weight,LinearLayout会避开设置过Weight属性的View做第一次measure,完了之后再对设置过Weight属性的View做二次measure,由此可见,Weight属性对性能是有影响的。
LinearLayout LinearlayoutView的measure
View如果我们或者我们的子View没有要求强制刷新,而父View给子View的值也没有发生变化,就不会做所谓的measure,但是Relativelayout做两次measure,在横向测量的时候,纵向测量还没完成,只有暂时使用myHeight传入子View,假设子View的Height不等于myHeight的高度,那么measure的优化就起不动任何作用.所以如果可以,尽量使用padding代替margin.
View的measure优化还有一个就是有做缓存处理,会根据目前的测量规格生产的key索引缓存数据。如果缓存中有,就不会做measure处理。
View文章主要内容摘自:https://blog.csdn.net/hejjunlin/article/details/51159419
网友评论