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

今天看书,看到了关于自定义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时,需要完成对内容的测量。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当父布局的高度属性为 `wrap_content` 自定义 View 的高度是根其内容动态确定的,无法直接获取准确的高度值。但可以通过以下方法来获取自定义 View 的准确高度: 1. 使用 ViewTreeObserver 监听布局完成事件:在自定义 View 的代码,可以使用 `ViewTreeObserver` 来监听布局完成事件,一旦布局完成,就可以获取到自定义 View 的准确高度。示例代码如下: ```java ViewTreeObserver vto = customView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { customView.getViewTreeObserver().removeOnGlobalLayoutListener(this); int height = customView.getHeight(); // 获取自定义 View 的高度 // 在这里可以使用获取到的高度进行后续操作 } }); ``` 2. 重写 `onMeasure()` 方法:在自定义 View 的代码,可以重写 `onMeasure()` 方法,在测量过程获取到准确的高度值,并保存起来供后续使用。示例代码如下: ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); // 在这里可以获取到准确的宽度和高度,并保存起来 } ``` 通过以上方法,你可以在父布局为 `wrap_content` 的情况下获取到自定义 View 的准确高度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值