问题如题:
ViewGroup 的 measureChild 方法和 measureChildWithMargins 方法的区别是什么,如何在实际开发中决定选择使用哪一个?
来源:可以从这里提问,欢迎大家踊跃提问~
更多问答 >>
-
每日一问 UndeclaredThrowableException 是什么异常?
2021-12-02 00:50 -
每日一问 | android hidden api 不是禁用反射,以及如何突破,「元反射」不行了?
2022-02-08 23:51 -
每日一问 | 如何构造一个 hide interface 的实现类?
2022-02-08 23:51 -
每日一问 | 脱糖对于Android 打包期间插桩的有什么影响?
2022-03-07 21:26 -
每日一问 .class vs Class.forName() vs loadClass() 类加载傻傻分不清楚?
2022-02-11 14:22 -
每日一问 | Gson中序列化对象的操作有低侵入的优化方案吗?
2021-12-02 00:50 -
每日一问 | 好奇ActivityThread中为什么会有一个 Application的集合?
2021-08-30 21:36 -
每日一问 | 关于 Activity 重建,值得探究的几个问题
2021-08-30 21:37 -
每日一问 | ViewModel 在什么情况下的「销毁重建」能够对数据进行无缝恢复?
2021-08-25 18:11 -
每日一问 | 我们经常说到的 Android 脱糖指的是什么?
2021-07-11 22:06
ViewGroup的
从名字上来看,后者多了个Margin,哈哈哈,实际上它的代码逻辑亦是如此。measureChild
和measureChildWithMargins
有什么不同?举个例子:
像这种ViewGroup尺寸确定,而子View尺寸没有固定数值的情况下,使用
使用measureChild
来测量子View,得出的measuredWidth
和measuredHeight
分别是[500, 300]。measureChildWithMargins
方法,子View的measuredWidth
和measuredHeight
就会变成[460, 260](上下左右各20)要是子View宽高有明确数值,那么用
measureChild
和measureChildWithMargins
测量的结果都是一样的,此时如果ViewGroup宽高是wrap_content
的话,会把ViewGroup "撑大",这个大家都知道。至于在开发中怎么选择,这就看你喜欢了,如果你的ViewGroup支持
margin
属性的话,用measureChildWithMargins
会方便些(我们常用的LinearLayout和FrameLayout也用到了这个方法)。甚至你两个都不用,直接通过child
.measure
来测量也是可以的。注意:
如果你想在自定义ViewGroup中使用measureChildWithMargins
,必须要重写generateLayoutParams
方法并在里面返回MarginLayoutParams的实例,因为默认的LayoutParams是不支持margin
属性的。当然了,如果你有自定义的LayoutParams的话,也要把它改为继承自MarginLayoutParams。完美
补充一点,带margin的方法的参数还多了个widthUsed和heightUsed参数。当自定义的ViewGoup有多个子View的时候,使用这个带margin的方法就很方便了。比如有两个子View ...查看更多
补充一点,带margin的方法的参数还多了个widthUsed和heightUsed参数。当自定义的ViewGoup有多个子View的时候,使用这个带margin的方法就很方便了。比如有两个子View,第一个wrap_content,第二个march_parent,则测量第二个子view的时候只要传入第一个子view的宽高即可。若是使用不带margin的方法,就需要重新去计算并组合measureSpec了,稍微麻烦了一丢丢。 所以,无脑使用measureChildWithMargins吧,毕竟支持margin不香嘛~,麻烦一点的就是generateLayoutParams相关的几个方法也要重写了