自定义View之onMeasure()

其实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);//获得Mode
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值