Android - 如何知道一个视图是否在RelativeLayout中覆盖另一个视图

7
我有一个RelativeLayout,里面有两个视图。view1每十秒就在布局内的随机位置重新创建。view2在静态位置,并且比view1大。我想知道第一个视图何时被创建在第二个视图区域内,我该怎么做?
我目前正在尝试使用以下代码,但它并不能很好地运行。
        if (paramsView1.topMargin > View2Ystart
            && paramsView1.topMargin < View2Yend
            && paramsView1.leftMargin > View2Xstart
            && paramsView1.leftMargin < View2Xend) {
        return true
    }
    else
        return false;

只有当view1完全在view2内部时,它才会返回true。我希望它只有在view1与view2接触时才返回true。


您可以获取每个视图的坐标和尺寸,通过计算来确定是否有重叠。 - zgc7009
我目前正在尝试做这件事,但没有成功。我在我的问题中添加了一些代码。 - TheModularMind
2个回答

14

你应该使用 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
1
@zgc7009 这个问题明确指出:“只有当 view1 完全在 view2 内部时,我才希望它返回 true。” - matiash
我认为他在编辑中添加了最后一行,如果是这样的话,这个程序可以正常工作。 - zgc7009
我刚刚尝试了您使用.contains()方法的Rect对象解决方案。它非常有效。 - TheModularMind

0

对我来说,建议的解决方案不起作用。相反,我使用了这个,而且正常运行:

Rect rect1 = new Rect((int)childTop.getX(), (int)childTop.getY(), (int)childTop.getX()+childTop.getWidth(), (int)childTop.getY()+childTop.getHeight());
Rect rect2 = new Rect((int)button.getX(), (int)button.getY(), (int)button.getX()+button.getWidth(), (int)button.getY()+button.getHeight());

if (rect1.contains(rect2)) {
      
} else {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接