自定义View之onMeasure()

来源:互联网 发布:股票个股分析软件 编辑:程序博客网 时间:2024/06/03 19:59

其实onMeasure()一般不需要重写,因为本来的宽高设值方式就很合理啊,除非你有一些特殊的、变态的要求,不过对其了解一些还是有必要的:


一、关于“onMeasure(MeasureSpec width,MeasureSpec height)的参数”是从哪里传过来的:

onMeasure()函数由包含这个View的具体的ViewGroup调用,因此值也是从这个ViewGroup中传入的。

当控件的容器正要放置该控件时调用.容器会问控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.

注:它也必须是从容器传过来的,不然,当宽或高取match_parent时,它的Size如何确定?因为它的Size是由“容器的宽高”减去“padding、margin、其它控件的宽高等”。


二、关于如何确定控件的宽高:

这就不得不了解一个类:MeasureSpec。

这个类里包含两个东西,Mode和Size。

int widthMode = MeasureSpec.getMode(widthMeasureSpec);//获得Modeint widthSize = MeasureSpec.getSize(widthMeasureSpec);//获得Size

Mode分为三种:
1、MeasureSpec.EXACTLY:当控件的长或宽指定为match_parent或者固定数值时,它的Mode为EXACTLY,此时得到的Size即为控件的长或宽。
2、MeasureSpec.AT_MOST:当控件的长或宽指定为wrap_content时,它的Mode为AT_MOST,此时得到的Size是控件的长或宽可设定的最大值。
3、MeasureSpec.UNSPECIFIED:我们可以随意指定控件的大小,不受容器的限制。很少用到。

在知道以上的长和宽的Size信息后,最终长和宽的值还是由你决定。决定好后,调用:

setMeasuredDimension(width,height);
0 0
原创粉丝点击