登录

去注册

登录

注册

去登录

注册

每日一问 | getWidth, getMeasuredWidth 有什么区别?

xiaoyang   2019-07-05   收藏

传说中一个是 View 宽度,一个是 View 中的内容宽度,这个解答对吗?

6

getWidth和getMeasuredWidth的区别:

getMeasuredWidth方法返回的是测量后的宽度,这个宽度是当setMeasuredDimension方法(measure方法最终会调用setMeasuredDimension)被调用后刷新的。
而getWidth返回的是最终layout出来的宽度,在View代码中返回的是【mRight - mLeft】,这个mRight和mLeft,是在setFrame方法被调用后赋值的(layout方法最终会调用setFrame)。

也就是说,getMeasuredWidth返回值的大小,取决于setMeasuredDimension,而getWidth,则取决于layout。
在大多数情况下,这两个方法返回的大小都是一样的,当然了,像HorizontalScrollView在可滑动的时候,它子View的这两个方法返回的就不一样了。

传说中一个是 View 宽度,一个是 View 中的内容宽度,这个解答对吗?

在常规的View中,比如TextView,ImageView这些,如果没有明确指定宽度的话,那么他们的getMeasuredWidth返回的宽度,确实就是实际内容的宽度。
但如果在xml布局里或自定义View中故意把宽度设置的很大,或者很小,比如设置宽度为9999999,这种情况就不算了。
所以我的回答是:如果这个View和它所在的ViewGroup(在ViewGroup中的onMeasure也可做手脚),都遵守规矩的话,那么这句话就是对的。

回复
陈小缘 : @菜菜菜菜菜鸟 

不好意思,我错了,我忘了在HorizontalScrollView中的onMesure会把child的MesureSpec强制变成EXACTLY了。重新举个例: 比如在自定义的ViewGroup中,你  ...查看更多

2019-07-04 回复
菜菜菜菜菜鸟 : @陈小缘 

我打印的结果是它们的值是一样的,不晓得哪儿的问题

2019-07-04 回复
菜菜菜菜菜鸟 : @陈小缘 

当然了,像HorizontalScrollView在可滑动的时候,它子View的这两个方法返回的就不一样了。 这句话怎么理解呢?

2019-07-04 回复
1

①getMeasuredWidth方法获得的值是setMeasuredDimension方法设置的值,它的值在measure方法运行后就会确定
②getWidth方法获得是layout方法中传递的四个参数中的mRight-mLeft,它的值是在layout方法运行后确定的
③一般情况下在onLayout方法中使用getMeasuredWidth方法,而在除onLayout方法之外的地方用getWidth方法。

回复
1

回复
0

<spanmicrosoft yahei';="" font-size:="" 14px;"="">

getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小。

getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小

</spanmicrosoft>

回复
0

getMeasuredWidth 是measure执行时在其中调用setMearsureDimens后就可以获取到。

getWidth 是layout方法调用完就可以获取到,layout方法中有一个setFrame设置左上右下四个坐标,执行完了就可以获取到了。

回复
0

getMeasuredWidth 是onMeasure 以后拿到的值‘

getWidth 是onLayout 以后拿到的值

回复
0

本周2/3

回复
苏灿烤鱼 : @鸿洋 

签到,虽然不能回答问题,但是还是要过来凑个人气!

2019-07-03 回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定