为什么你要重写View的onMeasure()?

前言:只是帮助一些初学者对这个方法的理解 ( ̄0  ̄)y go。

在Android自定义控件当中,几乎都会重写这个方法,相信很多初学者看到这个方法是一脸茫然.(╯‵□′)╯ …下面我就简单带你去了解了解。

首先我们先继承View 重写 onMeasure()

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

说一下这几个参数的意思

widthMeasureSpec : 父类的宽度

heightMeasureSpec:父类的高度

super.onMeasure(widthMeasureSpec,heightMeasureSpec);默认调用父类测量方法

调用默认的测量方法会发生什么?

如果自定义view在xml布局中 layout_width =10dp 和 layout_height=10dp 那么该控件会以 10dp的宽高显示。
如果控件的宽和高 是 wrap_content 或者 match_parent 那么会以父类的宽高显示

总结

如果你不想用默认的测量方法. 就是控件的宽高当为wrap_content

用父布局的宽和高感到不爽。 (ノ`Д´)ノ

没有达到预期的结果就要 重写

关于怎么重写?

其实很简单:

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //设置控件的宽和高
         setMeasuredDimension(100, 100);
    }

什么?觉得太敷衍了? (╬ ̄皿 ̄)凸 想知道 怎么获得 控件在布局的宽和高 属性根据情况来设置宽高?

介绍下怎么获取

首先要简单的了解一下这个东西 : MeasureSpec模式 有三种

① UNSPECIFIED :View的宽高值设置为0的时候或者没有设置宽高

② EXACTLY :当View的宽高值设置为match_parent

③AT_MOST:当View的宽高值设置为wrap_content

所以我们来重新复写这个 onMeasure 方法吧。根据模式来判断(/≧▽≦/)

贴上自己常用的判断

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //获得宽度的模式
    int wSpecMode = MeasureSpec.getMode(widthMeasureSpec);
    //获得宽度的大小
    int wSpecSize = MeasureSpec.getSize(widthMeasureSpec);
    //获得高度的模式
    int hSpecMode = MeasureSpec.getMode(heightMeasureSpec);
    //获得高度的大小
    int hSpecSize = MeasureSpec.getSize(heightMeasureSpec);
    //默认值
    int result = 100;

    //当控件高和宽 为 wrap_content
    if (wSpecMode == MeasureSpec.AT_MOST && hSpecMode == MeasureSpec.AT_MOST) {
        setMeasuredDimension(result,result );
        //当宽为 wrap_content 
    } else if (wSpecMode == MeasureSpec.AT_MOST) {
        setMeasuredDimension(result, hSpecSize);
        //当高为 wrap_content 
    } else if (hSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(wSpecSize, result);
    }
}

好,介绍就到此结束,各位知道为什么要重写这个了吗?希望对大家有所帮助 谢谢 o( ̄▽ ̄)ブ

发布了13 篇原创文章 · 获赞 46 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a8688555/article/details/53638936