Android获取View的边界矩形

时间:2011-04-20 12:26:03

标签: android

我正在为Android应用程序实施拖放操作。为了知道drop是否发生在drop target中,我需要知道drop target视图的边界矩形。然后,当我得到getRawX/Y()动作时,我会看到MotionEvent中的ACTION_UP是否属于此矩形。

我意识到我可以在放置目标视图上调用getLeft/Right/Top/Bottom(),但这些是相对于父容器的。我似乎需要知道“真实”或原始值,以便我可以将它们与MotionEvent中的原始x,y进行比较。

5 个答案:

答案 0 :(得分:54)

回答我自己的问题......是的,View.getLocationOnScreen()做了伎俩。例如,

private boolean isViewContains(View view, int rx, int ry) {
    int[] l = new int[2];
    view.getLocationOnScreen(l);
    int x = l[0];
    int y = l[1];
    int w = view.getWidth();
    int h = view.getHeight();

    if (rx < x || rx > x + w || ry < y || ry > y + h) {
        return false;
    }
    return true;
}

答案 1 :(得分:31)

您也可以在这里使用Rect:

private boolean isViewContains(...) {
    int[] l = new int[2];
    imageView.getLocationOnScreen(l);
    Rect rect = new Rect(l[0], l[1], l[0] + imageView.getWidth(), l[1] + imageView.getHeight());
    return rect.contains(rx, ry);
}

不那么罗嗦,可能更快,但肯定(IMO)更具可读性。

答案 2 :(得分:5)

此代码考虑了所涉及的Views的周长,并且当拖动的true完全位于放置区域内时,仅返回View

public boolean containsView(View dropZone, View draggedView){
     // Create the Rect for the view where items will be dropped
     int[] pointA = new int[2];
     dropZone.getLocationOnScreen(pointA);
     Rect rectA = new Rect(pointA[0], pointA[1], pointA[0] + dropZone.getWidth(), pointA[1] + dropZone.getHeight());

     // Create the Rect for the view been dragged
     int[] pointB = new int[2];
     draggedView.getLocationOnScreen(pointB);
     Rect rectB = new Rect(pointB[0], pointB[1], pointB[0] + draggedView.getWidth(), pointB[1] + draggedView.getHeight());

     // Check if the dropzone currently contains the dragged view
     return rectA.contains(rectB);
}

答案 3 :(得分:0)

Kotlin扩展解决方案

这里是扩展获取程序的组合,您可以添加它们以快速获得任何视图的x / y坐标或边界框

val View.screenLocation
    get(): IntArray {
        val point = IntArray(2)
        getLocationOnScreen(point)
        return point
    }

val View.boundingBox
    get(): Rect {
        val (x, y) = screenLocation
        return Rect(x, y, x + width, y + height)
    }

答案 4 :(得分:0)

使用getGlobalVisibleRect

val rect = Rect()
view.getGlobalVisibleRect(rect)
val isContainedInView = rect.contains(x, y)