【问题标题】:Android - How to know if a view overlay another view in RelativeLayoutAndroid - 如何知道一个视图是否覆盖了RelativeLayout中的另一个视图
【发布时间】:2014-07-25 16:56:32
【问题描述】:

我有一个内部有两个视图的 RelativeLayout。 view1 每十秒在布局内的随机位置重新创建。 view2 处于静态位置,并且比 view1 大。我想知道什么时候在第二个视图区域内创建了第一个视图,我该怎么做?

我目前正在尝试此代码,但 id 无法正常工作。

        if (paramsView1.topMargin > View2Ystart
            && paramsView1.topMargin < View2Yend
            && paramsView1.leftMargin > View2Xstart
            && paramsView1.leftMargin < View2Xend) {
        return true
    }
    else
        return false;

只有当 view1 接触到 view2 的一侧时它才返回 true。我希望只有当 view1 完全在 view2 内时它才返回 true。

【问题讨论】:

  • 您可以获取每个视图的坐标和尺寸,并进行数学运算以确定是否存在重叠。
  • 我目前正在尝试这样做,但没有成功。我在我的问题中添加了一些代码

标签: android layout view


【解决方案1】:

您应该使用getLeft()getRight()getTop()getBottom()

if (v1.getTop() >= v2.getTop() &&
    v1.getLeft() >= v2.getLeft() &&
    v1.getRight() <= v2.getRight() &&
    v1.getBottom() <= v2.getBottom()) { ...

请注意,这些值在父级布局时可用,即不会紧跟在addView() 之后。

另一种可能更灵活的解决方案是使用每个视图的坐标构建Rect 实例,例如

Rect rect1 = new Rect(v1.getLeft(), v1.getTop(), v1.getRight(), v1.getBottom());
Rect rect2 = new Rect(v2.getLeft(), v2.getTop(), v2.getRight(), v2.getBottom());

那么您可以使用rect1.contains(rect2)Rect.intersects(rect1, rect2) 或任何其他组合。

【讨论】:

  • 上述说法只有在v1在v2之内时才成立,如果重叠则不成立,但思路是有的。
  • @zgc7009 问题指定“我希望只有当 view1 完全在 view2 内时它才返回 true。”
  • 我认为他在编辑中添加了最后一行,在这种情况下效果很好。
  • 我刚刚使用 .contains() 方法尝试了使用 Rect 对象的解决方案。效果很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
相关资源
最近更新 更多