Android中View的绘制流程以及View的优化

本文详细解析了Android中视图(View)的测量(Measure)、布局(Layout)及绘制(Draw)过程。介绍了MeasureSpec如何影响View的大小,并阐述了ViewGroup如何测量自身及其子元素。此外,还探讨了优化视图绘制的方法。

Measure过程

measure用来测量view的宽和高,performTraversals()调用performMeasure()完成顶级View(DectorView)的测量,在performMeasure()中调用measure(),measure()中又会调用onMeasure(),在onMeasure()中对所有的子元素进行测量,这样流程就从父容器传递到了子元素中,子元素又会重复父容器的measure过程,如此反复完成整个View树的遍历。

对于普通view,在view测量的时候,系统会将view的LayoutParams在父容器的MeasureSpec约束下转成对应的MeasureSpec,然后再根据这个MeasureSpec来确定view的宽高。所以说view的宽高是由view的LayoutParams和父容器的MeasureSpec共同决定的。对于顶级view,DectorView的MeasureSpec是由窗口的尺寸和其自身的LayoutParams共同决定。DectorView是顶级View,包括titleBar和ContentView,ContentView就是加载的布局。

MeasureSpec中包含SpecMode(测量模式)和SpecSize(测量大小),SpecMode分三类,常用的有EXACTLY、AT_MOST,如果view的MeasureSpec的SpecMode是EXACTLY模式,说明父容器已经检测出view需要的精确大小,view的最终大小就是view的MeasureSpec的SpecSize,这种模式对应于view的LayoutParams中的match_parent和具体数值这两种模式;如果view的MeasureSpec的SpecMode是AT_MOST模式,说明父容器指定了一个可用大小SpecSize,view的大小不能大于这个值,具体是什么值要看view的具体实现,view的大小不能超过view的MeasureSpec的SpecSize,对应于view的LayoutParams中的wrap_content。

View的Measure过程:

View的测量在其measure()方法中完成,measure()被final修饰,不可重写,在measure()中调用了onMeasure(),onMeasure()中调用了setMeasuredDimension()设置view的宽和高,view的宽和高通过getDefaultSize()返回,getDefaultSize()返回的就是MeasureSpec的SpecSize。

ViewGroup的measure过程:

ViewGroup除了要测量自己之外,还要遍历所有的子元素的measure()方法,各个子元素再去递归执行这个过程。ViewGroup没有重写onMeasure(),onMeasure()需要各个子类去具体实现。LinearLayout的测量过程是,先遍历所有的子元素,子元素测量完成后,根据子元素的高度和或者宽度和,再测量LinearLayout自身的宽高。

Layout过程

Layout的作用是ViewGroup用来确定子元素的位置,当ViewGroup的位置被确定后,它在onLayout中会遍历所有的子元素并调用其layout方法,在layout方法中onLayout方法又会被调用。

Draw过程

通过绘制canvas,然后返回canvas,步骤:

1绘制背景,background.draw(canvas)

2 绘制自己,onDraw()

3 绘制子元素,dispatchDraw(),会遍历调用所有子元素的draw()方法

4 绘制装饰,onDrawScrollBars

引申:view的绘制优化

1 不要在onDraw()中创建新的局部对象

onDraw()方法可能被频繁调用,这样会在一瞬间产生大量的局部对象,占用过多内存,增加GC频率

2 onDraw()中不能执行耗时任务

onDraw()执行耗时任务,可能造成view绘制不流畅,每帧绘制时间不能超过16ms


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值