自定义View中onMeasure在wrap_content时的处理

本文深入解析Android自定义View的onMeasure方法,特别是如何在遇到wrap_content尺寸约束时,自行计算合适的尺寸,并提供一个案例来说明如何正确地为自定义View设置初始尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看书,看到了关于自定义View的技巧,其中关于onMeasure这个方法是必须覆盖的。原因何在?因为在view的onMeasure方法中,有一个getDefaultSize的方法。方法中,对于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;
  }
也就是说,我们必须自己处理在wrap_content(AT_MOST)的情况下的view的大小。其推荐的解决方案是给view一个初始值,那我的问题是如何确定这个值呢?

根据view的测量机制,view的子类,比如textview和imageview,其在onMeasure方法中必定也是对wrap_content的情况做了处理。通过查看源码,确实是如此。拿textview的宽度来说,它对wrap_content的情况做的特殊处理就是测量内容(字符)的长度等等,再根据计算结果和传入的宽度值做比较取小,从而得到那个初始值。

最后,推而广之,也就是说,在wrap_content时,需要完成对内容的测量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值