Android View绘制的流程
1,View绘制的流程
测量 --------> 排版(布局) -----> 绘制
Measure layout ------->draw
★测量: 一般我们重写onMeasure方法
【1】measure方法由于是final的所以不可以重写 ,我们发现有一个onMeasure方法 那我就重写onMeasure方法,实际的测量工作是在onMeasure方法里面完成
我们需要在onMeasure方法里面调用setMeasuredDimension 完成控件的测量
/**
* widthMeasureSpec:父容器对myView宽度的期望 (layout_width)
* heightMeasureSpec:父容器对myView高度的期望 (layout_height)
* 参数1和2 实际上是由2部分组成 mode(模式) + size(具体控件大小) 组成
* 模式分三种
* [1]UNSPECIFIED 为指定 爹不管模式 父容器对孩子没有约束
* [2]EXACTLY 精确的 父容器对孩子的大小有限制 布局的参数是一个具体的值 或者match_parent
* [3]AT_MOST 父容器对孩子的最大值有要求 对应布局中wrap_content
*
* 我们在布局中声明的200dp宽和高 是如何传递到onMeasure方法里面的??
* [1]首先孩子像父容器申请200dp的宽layout_width和200dp的高layout_height ,父容器拿着孩子的申请打包成对孩子的期望widthMeasureSpec,heightMeasureSpec.
* 调用孩子的measure方法 ---->会调用onMeasure方法
*
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mode = MeasureSpec.getMode(widthMeasureSpec);
if (mode ==MeasureSpec.EXACTLY ) {
//获取大小
int size = MeasureSpec.getSize(widthMeasureSpec);
System.out.println("size:"+size);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
【2】 排版 layout
l t r b 参数 如下图
通过layout方法底层调用setFrame方法完成对view的上下左右进行赋值,当我们在定义一个类继承View 的时候一般不需要重写此方法,因为view摆放的位置是由父容器发起的
【3】绘制draw
-
draw 绘制流程
draw方法实现对view绘制,我们在实际开发中一般会重写onDraw方法往当前的view上画内容 不会重写draw,先绘制背景,在绘制内容 当绘制内容的时候需要重写onDraw();
/**
* 往view上画内容
*/
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
canvas.drawLine(10, 10, 40, 40, paint);
}