前言:只是帮助一些初学者对这个方法的理解 ( ̄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);
}
}