Подтвердить что ты не робот

Android получает ограничивающий прямоугольник вида

Я реализую перетаскивание для приложения для Android. Чтобы узнать, происходит ли падение внутри целевой цели, мне нужно знать ограничивающий прямоугольник для целевого представления drop. Тогда я увижу, будет ли getRawX/Y() в MotionEvent попадать внутрь этого прямоугольника, когда я получу действие ACTION_UP.

Я понимаю, что я могу вызвать getLeft/Right/Top/Bottom() в представлении целевой точки, но они относятся к родительскому контейнеру. Кажется, мне нужно знать "реальные" или "необработанные" значения, поэтому я могу сравнить их с необработанными x, y в MotionEvent.

4b9b3361

Ответ 1

Отвечая на мой вопрос... да, 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;
}

Ответ 2

Здесь вы также можете использовать 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) более читаемый.

Ответ 3

В этом коде учитывается периметр 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);
}