检测视图是不是重叠

Posted

技术标签:

【中文标题】检测视图是不是重叠【英文标题】:detect if views are overlapping检测视图是否重叠 【发布时间】:2014-10-08 08:47:30 【问题描述】:

我在其他尺寸的屏幕上绘制视图时遇到问题! 我需要具有两个 View 类型参数的方法。如果第一个视图与第二个视图重叠,则返回 true,在另一种情况下返回 false!

【问题讨论】:

尝试使用不同的布局 您是否针对不同的屏幕分辨率使用不同的布局? 我不能改变布局,这是客户的愿望! 不,使用一种布局!第一个视图的宽度可以动态变化 这是正确答案***.com/a/24047970/5749914。 【参考方案1】:

您还可以使用 Rect.intersect() 来查找重叠视图。

    int[] firstPosition = new int[2];
    int[] secondPosition = new int[2];

    firstView.getLocationOnScreen(firstPosition);
    secondView.getLocationOnScreen(secondPosition);

    // Rect constructor parameters: left, top, right, bottom
    Rect rectFirstView = new Rect(firstPosition[0], firstPosition[1],
            firstPosition[0] + firstView.getMeasuredWidth(), firstPosition[1] + firstView.getMeasuredHeight());
    Rect rectSecondView = new Rect(secondPosition[0], secondPosition[1],
            secondPosition[0] + secondView.getMeasuredWidth(), secondPosition[1] + secondView.getMeasuredHeight());
    return rectFirstView.intersect(rectSecondView);

【讨论】:

注意检查两个视图是否可见,否则返回false,否则getLocationOnScreen会抛出NullPointerException【参考方案2】:

Berserk 感谢您的帮助! 经过一些实验,我编写了检测视图是否重叠的方法!

private boolean isViewOverlapping(View firstView, View secondView) 
        int[] firstPosition = new int[2];
        int[] secondPosition = new int[2];

        firstView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        firstView.getLocationOnScreen(firstPosition);
        secondView.getLocationOnScreen(secondPosition);

        int r = firstView.getMeasuredWidth() + firstPosition[0];
        int l = secondPosition[0];
        return r >= l && (r != 0 && l != 0);
    

【讨论】:

这是否涵盖了所有角落? 是的,但我不检查它。这个解决方案对我有好处。为你试一试。 这仅对始终水平对齐的两个视图有效,但当视图因水平分离而无法重叠时不起作用。简而言之,这只适用于测试垂直重叠。 @LoungeKatt 这个方法是测试水平重叠,而不是垂直重叠。请注意,我们正在处理宽度和 x 坐标。 @Elliott 不管怎样,它仅限于一个轴。这就是重点。【参考方案3】:

这类似于Marcel Derks 的答案,但无需额外导入即可编写。它使用形成Rect.intersect 的基本代码,而不创建Rect 对象。

private boolean isViewOverlapping(View firstView, View secondView) 
    int[] firstPosition = new int[2];
    int[] secondPosition = new int[2];

    firstView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    firstView.getLocationOnScreen(firstPosition);
    secondView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    secondView.getLocationOnScreen(secondPosition);

    return firstPosition[0] < secondPosition[0] + secondView.getMeasuredWidth()
            && firstPosition[0] + firstView.getMeasuredWidth() > secondPosition[0]
            && firstPosition[1] < secondPosition[1] + secondView.getMeasuredHeight()
            && firstPosition[1] + firstView.getMeasuredHeight() > secondPosition[1];

您不需要强制进行视图测量,但这样做是为了进行良好的测量;)

【讨论】:

【参考方案4】:

在 Kotlin 中,您可以使用 View 类扩展。结果是一个更紧凑的解决方案:

// Returns true if the view overlaps another view.
// Additionally checks whether another view will overlap if it is shifted to delta values.
fun View.isOverlap(other: View, deltaX: Int = 0, deltaY: Int = 0): Boolean 
    val thisXY  = IntArray(2).apply  getLocationOnScreen(this) 
    val otherXY = IntArray(2).apply 
        other.getLocationOnScreen(this)
        this[0] += deltaX
        this[1] += deltaY
    
    return thisXY.let  Rect(it[0], it[1], it[0] + width, it[1] + height) 
        .intersect(otherXY.let  
            Rect(it[0], it[1], it[0] + other.width, it[1] + other.height)
         )


// usage example:
if (myView.isOverlap(otherView)) 
    // do something ...

【讨论】:

【参考方案5】:

似乎您正在询问解决问题的代码。我发布了我认为可能有效的逻辑:

    创建一个函数,它将两个视图作为参数,并返回一个布尔值。 现在使用this 检查屏幕上两个视图的位置。它会让您了解它们是否重叠。 根据它返回真假。

【讨论】:

感谢您回答的帖子!我会像你说的那样尝试实施。如果解决方案效果很好,我会在这里写代码!【参考方案6】:

以非常简单的方式帮助您。我将给出一个逻辑代码,它无疑会检测到两个碰撞的视图,即使它们正在移动。这适用于位图、图像视图以及您能想到的任何东西。在这里,这就是全部:

//LET'S SAY WE DETECT IF PLAYER COLLIDES WITH ENEMY
if((Math.abs(yourviewid.getY() - yoursecondviewid.getY()) < 75) 
     && (Math.abs(yourviewid.getX() - yoursecondviewid.getX()) < 75))
    //DO YOUR STUFF HERE

【讨论】:

以上是关于检测视图是不是重叠的主要内容,如果未能解决你的问题,请参考以下文章

如何检测两个 CALayer 是不是重叠?

分配代理以检测滚动后,TableView单元格重叠

如何检测两个正则表达式在它们可以匹配的字符串中是不是重叠?

检测重叠周期的算法[重复]

Opencv中对象检测的重叠

如何修复 strcpy 以便检测重叠字符串