View绘制流程
- measure:确定大小
- layout:确定位置
- draw:执行绘制
measure
- 关键方法
方法 1:public final void measure(int widthMeasureSpec, int heightMeasureSpec);
功能:计算一个view应该显示的大小尺寸。但是,测量工作没有实际生效!!!
方法 2:protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
功能:设定view的尺寸,view子类通过重写此方法确定其内容的大小尺寸。包含子视图的viewGroup应在此遍历测量所有子视图的尺寸!
方法 3:protected final void setMeasuredDimension(int measuredWidth, int measuredHeight);
功能:此方法必须被onMeasrue()方法调用,来存储已测量view的width和height。
- 相关类
1,MeasureSpec:组合size, mode到一个int数据中。
mode三个值:
- EXACTLY 子视图的大小为父视图指定的size值
- AT_MOST 子视图的大小不超过size值
- UNSPECIFIED 子视图可设置成任意的大小,没有任何限制。
layout
- 关键方法
方法 1:public void layout(int l, int t, int r, int b);
功能:指定内部子view的显示位置和尺寸。但是,没有实际生效!!!
方法 2:protected void onLayout(boolean changed, int left, int top, int right, int bottom);
功能:指定内部childView的尺寸和位置。自定义的ViewGroup应重写此方法,并遍历调用其包含的所有childView的layout()方法!
方法 3:public final int getWidth();
功能:获取view的宽度。计算方法:mRight - mLeft
方法 4:public final int getMeasuredWidth();
功能:获取view测量后的宽度。计算方法:setMeasuredDimension(int measuredWidth, int measuredHeight)设定的值。
draw
- 关键方法
方法 1:public void draw(Canvas canvas);
功能:绘制view(以及其包含的childView)。
方法 2:protected void onDraw(Canvas canvas);
功能:执行自定义的绘制工作。