自定义控件01

2017-05-28  本文已影响20人  EvanPoison

前言

自定义控件,一直感觉是很高深的技术,现在准备入门,攻克它

  1. 自定义view的生命周期
    先来打印一下它的生命周期方法
    ![T@L{SRPMP%0V6]24Y%5Z(~4.png](https://img.haomeiwen.com/i6010233/efe93db1679cdff5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    看过之后,也就知道了,为什么在activity的oncreate()方法里,不能直接得到view的宽高,因为还没开始测量
    image.png
    当activity被销毁,自定义view也就死亡
    在activity的onResume()回调后,自定义view才添加到window,回调onAttachedToWindow(),才开始测量
  2. 一个问题
    在布局文件中,自定义view的宽高都是写的wrap_content,但是绘制出来却是match_parent的效果


    image.png

    查看super.onMeasure()源码,发现当测量模式是AT_MOST和EXACTLY,取的都是指定的值

 public static int getDefaultSize(int size, int measureSpec) {
        int result = size;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        switch (specMode) {
        case MeasureSpec.UNSPECIFIED:
            result = size;
            break;
        case MeasureSpec.AT_MOST:
        case MeasureSpec.EXACTLY:
            result = specSize;
            break;
        }
        return result;
    }

所以呢,如果我们的自定义view,在布局文件中写的是wrap_content,那么我们要重写onMeasure()方法,来指定测量的size(宽,高)

  1. 一个问题
    为什么会调用三次onMeasure(),两次onLayout(),一次onDraw()???


    image.png
  2. 一些概念

上一篇 下一篇

猜你喜欢

热点阅读