自定义View
    自定义View有四个构造函数
    如果View是在Java代码里面new的,则调用第一个构造函数
    如果View是在.xml里声明的,则调用第二个构造函数
    不会自动调用. 一般是在第二个构造函数里主动调用  如View有style属性时
    最后一个基本上用不到
    Measure:
        测量View的宽高
        (1.在某些情况下,需要多次测量(measure)才能确定View最终的宽高;
        (2.该情况下,measure过程后得到的宽高可能不准确;
        (3.此处建议:在layout过程中onLayout()去获取最终的宽高
    Layout:
        (1.计算视图(View)的位置
        (2.即计算View的四个顶点位置:Left、Top、Right和Bottom
    Draw:
        绘制View视图
    系统自带的View可以在xml中配置属性,对于写的好的自定义View同样可以在xml中配置属性,为了使自定义的View的属性可以在xml中配置,需要以下4个步骤:
        1. 通过 <declare-styleable> 为自定义View添加属性
        2. 在xml中为相应的属性声明属性值
        3. 在运行时(一般为构造函数)获取属性值
        4. 将获取到的属性值应用到View


自定义view 的三种方式:
1. 组合基础控件
   就是将系统原有的控件进行组合,构成一个新的控件。这种方式下,不需要开发者自己去绘制图上显示的内容,
    标题栏例子:继承LinearLayout,RelativeLayout等都可以。继承这些系统现成的ViewGroup,是因为这样可以不用再重写onMeasure,onLayout等,这样省事很多。
    由于这里是一个布局控件,要用LayoutInflater来填充,所以需要继承ViewGroup,如果继承View的直接子类,编译会不通过。

2. 继承基础控件,做相应的更改。
    通过继承系统控件来完成自定义View,一般是在原有控件基础上修改,不会做大幅度改动,如在TextView的文字下方添加下划线。复用系统控件的onMeasure和onLayout方法,重写
    onDraw方法,在其中绘制一些需要的内容。

3. 继承View 或 ViewGroup:
    (1)直接继承View类
    自绘View控件时,这一过程是在重写的onDraw方法中实现的。由于是view,它没有子控件了,所以重写onLayout没有意义。onMeasure的方法可以根据自己的需要来决定是否需要重写,
    很多情况下,不重写该方法并不影响正常的绘制。然后在Activity界面的布局文件中引入
    (1)直接继承ViewGroup类
    需要直接继承ViewGroup,onLayout是ViewGroup中的抽象方法,直接继承者必须实现该方法。所以onLayout方法必须要实现的,如果这里面的方法体为空,那该控件的子view就无法
    显示了。要想准确测量,onMeasure方法也是要重写的。下面例子中,只演示了第一个子view的测量和布局,onLayout方法中的child.layout,就完成了对子view的布局。