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 参数 如下图

 

   Android View绘制的流程

 

    通过layout方法底层调用setFrame方法完成对view的上下左右进行赋值,当我们在定义一个类继承View 的时候一般不需要重写此方法,因为view摆放的位置是由父容器发起的

【3】绘制draw

  • draw 绘制流程

Android View绘制的流程

     draw方法实现对view绘制,我们在实际开发中一般会重写onDraw方法往当前的view上画内容 不会重写draw,先绘制背景,在绘制内容 当绘制内容的时候需要重写onDraw();

    /**

     * 往view上画内容

     */

    @Override

    protected void onDraw(Canvas canvas) {

        Paint paint = new Paint();

        canvas.drawLine(10, 10, 40, 40, paint);

        

    }