6

我在这个问题中遇到了同样的问题,但是我很难理解 中的四个位置参数的确切含义layout(int l, int t, int r, int b)。我知道它们分别代表相对于父级的左、上、右和下,但“相对”到底在哪里?

例如,如果我将按钮向下移动 100 像素,为了将可点击区域向下移动 100 像素,我应该设置

//            l   t   r   b
button.layout(0, 100, 0, button.getHeight()+100)

? 第二个参数的整数是否100意味着相对于父级顶部向下 100 像素?第四个参数是否button.getHeight()+100也意味着相对于父级的顶部???我在我的设备上进行了测试,可点击区域没有按照我的意愿向下移动。我在这里很困惑,非常感谢任何帮助。

4

1 回答 1

9

布局的参数是相对于父视图的左上角的。X随着您向右移动而增加,Y随着您向下移动而增加。它与视图的当前位置无关。

您可能不想在其父级 onLayout 方法之外的子视图上调用布局。由于调用布局会以您不希望简单动画的方式更改内部状态,因此还会发生其他一些内部簿记。

通常布局是这样调用的:

child.layout(x, y, x + child.getMeasuredWidth(), y + child.getMeasuredHeight());

参数是绝对的,(0, 0) 在父级的左上角。

但是,如果您只是为动画移动视图,您可能想做更多类似的事情:

// Adjust horizontally; dx = change in x position
child.offsetLeftAndRight(dx);

// Adjust vertically; dy = change in y position
child.offsetTopAndBottom(dy);

offset* 方法的参数相对于视图的当前位置的。

如果您编写一个 ViewGroup 类以这种方式移动其子视图,请记住您可以随时获取布局请求。此时,您的 ViewGroup 的 onLayout 方法将尝试根据其通常的布局规则定位子级,并且需要调整此定位以反映您想要保留的任何其他累积移动。

于 2013-05-06T15:26:02.530 回答