【问题标题】:How to set the four parameters of View.layout(l, t, r, b)View.layout(l, t, r, b)的四个参数如何设置
【发布时间】:2013-05-06 12:57:16
【问题描述】:

我在this question中遇到同样的问题,但是我很难理解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相对于父级的顶部吗???我在我的设备上进行了测试,可点击区域没有按照我的意愿向下移动。我在这里很困惑,非常感谢任何帮助。

【问题讨论】:

  • 你试过x, y, width, height了吗?
  • x,y 是什么意思?
  • x 是左的另一个词,y 是顶部。
  • 我试过了,这样不行。我不认为这是正确的意思。
  • button.layout(0, 0, 100, 100); 有什么表现吗?

标签: android animation button clickable


【解决方案1】:

布局的参数是相对于父视图的左上角的。 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 方法将尝试根据其通常的布局规则定位子级,并且需要调整此定位以反映您想要保留的任何其他累积移动。

【讨论】:

  • 谢谢。您的回答很清楚,只是我的可点击区域仍然不会移动。如果我在将动画设置为布局layout.set(animation) 后调用 view.layout 是否正确?我必须在自定义 onAnimationListener 方法onAnimationEnd() 中执行此操作吗?
  • 视图的左/右/上/下属性用于触摸事件定位和调度。只要您移动视图的框架,您的触摸事件就会到达正确的位置。使用 pre-Honeycomb 动画系统确实会给您留下与触摸事件发送位置不同的“真实”位置绘制的视图。稍后添加的 translationX/translationY 属性确实会影响触摸事件定位。
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多