1、明确一些概念
MeasureSpec:“测量规格”或者“测量说明”,对view的测量宽和高有一定的影响作用,一个32位int值。
SpecSize:某种测量模式下的规格大小,MeasureSpec低30位;
SpecMode:测量模式有三种,MeasureSpec高2位;
unspecified:父容器不对view有任何限制,有多大给多大,一般用于系统内部,表示一种测量状态
exactly:view有所需要的精确大小,最终大小为specsize所指定的值,一般为match_parent和具体数值
at_most:父容器指定了一个可用大小即specsize,view大小不能大于这个值
parentSpecMode childLayoutParams | exactly | at_most | unspecified |
dp/px | exactly childsize | exactly childsize | exactly childsize |
match_parent | exactly parentsize | at_most parentsize | unspecified 0 |
wrap_content | at_most parentsize | at_most parentsize | unspecified 0 |
measure:是final类型的,子类不能重写;
layout和draw:是public的
ViewGroup:是个抽象类,没有重写onMeasure方法,但是提供了measureChildren方法;
2、measure测量过程
(1)、LinearLayout竖直方向为例(先测量子view在测量自己)
(2)view测量过程
3、layout确定过程(先确定自己在确定子view)
(1)、LinearLayout的竖直方向为例
(2)、子view的layout
4、draw画的过程
(1)、绘制背景background.draw(canvas);
(2)、绘制自己(onDraw);
(3)、绘制children(dispatchDraw);
(4)、绘制装饰(onDrawScrollBars);
5、更新绘制
(1)、invalidate:如果是子view,会绘制自身,调用draw方法,一般用于view的内容变化(大小和位置不变),在UI线程中调用,如果为viewgroup会调用真个view树
(2)、postinvalidate:是invalidate的变形,能在非UI线程中更新view
(3)、requestlayout:当view的大小和位置发生变化时,调用此方法,会使顶层viewgroup调用measure和layout,但不会调用draw
感谢:《Android开发艺术探索》