详解Android getWidth和getMeasuredWidth

本文详细解析Android中getWidth和getMeasuredWidth方法的使用场景与返回值单位,帮助开发者正确理解并应用这两个方法获取View的宽度信息。

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

Google文档的英文说明:

getWidth():

Return the width of the your view.

Returns: the width of your view, in pixels

getMeasuredWidth():

The width of this view as measured in the most recent call to measure(). This should be used during measurement and layout calculations only. Use getWidth() to see how wide a view is after layout.

Returns: the measured width of this view

前提知识点:

1. 在一个类初始化时,即在构造函数当中是得不到View的实际大小的(这个我测试过,的确)。大家可以试试,getWidth()和getMeasuredWidth()得到的结果都是0,但是可以从onDraw()方法或者dispatchDraw()方法里面获得。可以通过调用invalidate()来执行onDraw()和dispatchDraw()方法。

2. 这两个方法所得到的结果的单位是像素即pixel

正确的理解:

getWidth(): View在设定好布局后,整个View的宽度

getMeasuredWidth():对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure参数的值可以知己定义),否则得到的结果和getWidth()得到的结果是一样的。

这两个方法最主要的区别在于,是否使用了measure()方法,同时measure()使用的位置也很重要。

getHeight() 和 get MeasuredHeight() 区别同理。

参考:  【原】Android getWidth和getMeasuredWidth的正解

### Android `getMeasuredWidth` vs `getWidth` 源码解析 #### 方法定义与作用域 在Android视图系统中,`getMeasuredWidth()` `getWidth()` 是用于获取视图宽度的方法。然而两者的作用阶段不同。 对于 `getMeasuredWidth()` 而言,在源码实现上通过位运算返回了测量后的尺寸: ```java public final int getMeasuredWidth() { return mMeasuredWidth & MEASURED_SIZE_MASK; } ``` 这里涉及到了两个变量:`mMeasuredWidth` 存储的是经过布局参数以及父容器约束等因素计算之后的理想尺寸;而 `MEASURED_SIZE_MASK` 则是一个掩码用来提取实际大小部分的信息[^1]。 相比之下,`getWidth()` 获取的是视图已经完成布局后的真实显示宽度: ```java public final int getWidth() { return mRight - mLeft; } ``` 此方法简单地基于当前坐标系中的右边界减去左边界来得出结果[^2]。 #### 测量流程概述 在整个视图树构建过程中,每个节点都会经历三个主要阶段—测量(Measure),布局(Layout),绘制(Draw)[^3]。其中, - **测量阶段** (`onMeasure`) 主要负责根据自身的特性(比如wrap_content、match_parent等属性)、内容需求及父级控件给予的空间限制来进行初步估算; - **布局阶段** (`layout`) 则是在所有子项都完成了各自的测量工作之后,由父类决定具体摆放位置并最终确认每一个组件的确切尺寸。 因此当调用 `getMeasuredWidth()` 时实际上读取的就是上述第一个环节结束后的中间产物;只有等到整个层次结构完全确定下来即进入Layout步骤以后再访问 `getWidth()` 才能得到确切数值。 #### 关键差异点 尽管大多数情况下两者的值会保持一致,但在某些特定场景下可能会有所区别: - 如果某个 View 的可见状态被设为 GONE,则其 `getWidth()` 返回零,但是它仍然会有非零的 measured width 因为即使不可见也需要参与整体布局规划。 - 当界面正在初始化尚未完成全部生命周期事件之前查询这些属性也会得到不同的反馈,因为此时可能还没有执行到 Layout 阶段。 综上所述,理解这两个 API 的本质有助于开发者更好地掌握 Android UI 渲染机制,并能更精准地处理各种复杂的自定义视图逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值