child.layout()方法第三、第四个参数为何需要添加x、y前缀?
Android
View.layout() 两种传参方式的差异说明 首先明确 Android 中 View.layout(int left, int top, int right, int bottom) 四个参数的定义:所有参数都是子View相对于父容器的坐标值:
left:子View左边缘与父容器左边缘的水平距离top:子View上边缘与父容器上边缘的垂直距离right:子View右边缘与父容器左边缘的水平距离bottom:子View下边缘与父容器上边缘的垂直距离
子View最终的实际显示宽度为 right - left,实际显示高度为 bottom - top。
两种写法的具体差异
第一种写法(正确)
child.layout(x, y, x + child.getMeasuredWidth(), y + child.getMeasuredHeight());
该写法完全符合参数定义:
- 以(x,y)作为子View的左上角坐标
- 右边界 = 左边界x + 子View测量宽度,下边界 = 上边界y + 子View测量高度
- 最终子View的实际显示宽高和测量值完全一致,会正常展示在父容器的(x,y)位置,不会出现裁剪。
第二种写法(错误,仅x/y为0时可用)
child.layout(x, y, child.getMeasuredWidth(),child.getMeasuredHeight());
该写法混淆了“坐标值”和“宽高值”的概念,只有当x=0、y=0时,显示效果和第一种写法一致,只要x或y大于0就会出现异常:
举个实际例子:假设x=100,y=100,子View的测量宽高都是200:
- 按第二种写法传参后,right=200,bottom=200
- 子View实际宽度 = 200 - 100 = 100,比测量值小了一半,会被横向裁剪
- 子View实际高度 = 200 - 100 = 100,同样被纵向裁剪
如果x的数值大于子View的测量宽度,会出现right < left的情况,子View宽度为负,直接完全不显示。
第三、四个参数需要加x、y前缀的原因
本质是匹配layout()方法的参数规则:第三、四个参数是右、下边界相对于父容器的绝对坐标,不是子View自身的宽高值。只有给宽高值加上左边界x、上边界y的偏移,才能保证子View的实际显示宽高和测量值一致,避免出现显示不全、位置偏移甚至完全不可见的问题。
内容的提问来源于stack exchange,提问作者Tendai
相关产品推荐
相关产品推荐

