2017/10/2 上午 学习笔记

来源:互联网 发布:centos 路由器 编辑:程序博客网 时间:2024/04/23 14:12

View的绘制流程

1.首先是measure 即为获取View的宽高

    需要注意的是measure方法为final方法,因此该方法是不能重写的,如果我们想写一个自定义View就去重写onMeasure()方法。

    MeasureSpec作为View的内部类,在我的理解中它分为两部分,一部分是specMode,一部分是specSize,前者决定了View的测量模式,

   测量模式有三种:确定模式(EXACRLY)(MATCH_PARENT为此模式),最大模式(AT_MOST)(WRAP_CONTENT为此模式),非确定模式(UNSPECIFIED)(自己写宽高)。

   View的大小有父容器View的MeasureSpec和子View的布局信息共同决定,DecorView作为最底层View,它的父容器信息一般为屏幕大小。

   在每次测量结束的时候都会调用setMesureDimension()才会生效,这点在我们重写onMesure方法的时候需要注意。

   另外,在Activity的onResume生命周期执行之前,我们是无法通过getWidth这类方法获取到View的宽高信息的,因为我们还未进行View的测量。

2.Layout,布局

   其实整个布局操作都是由父容器View执行的,而ViewGroup的onLayout()方法是一个抽象方法,因此我们在写一个自定义ViewGroup的时候,必须要重写onLayout()方法才可以。

  我们都知道Visible属性当我们设置Gone属性的时候,我们知道View是不会占用空间的,这是因为在OnLayout方法中,当改属性为Gone时,不会对子View进行布局。

  这一步执行完成后就可以获取到View的宽高了,因为宽高是通过左上右下坐标计算的。

3.Draw 绘制

   View的Draw方法的大概步骤:

    step1:绘制View背景

    step2:判断是否需要绘制边框渐变效果,如果需要则走step3.1,否则走step4.1

    step3.1:保存canvas的边框参数,(渐变效果是在左上右下四个位置绘制的,例如ListView滑动到最后一个时的效果),创建额外的图层去进行渐变效果的绘制

    step3.2:绘制View

    step3.3:绘制View的子View

    step3.4:绘制边框渐变效果

    step4.1:绘制View

    step4.2:绘制子View

    step5:绘制滚动条效果

    end

    上述的过程中,绘制背景,绘制边框渐变,绘制滚动条都是在父控件中完成的。