Android получает ограничивающий прямоугольник вида
Я реализую перетаскивание для приложения для Android. Чтобы узнать, происходит ли падение внутри целевой цели, мне нужно знать ограничивающий прямоугольник для целевого представления drop. Тогда я увижу, будет ли getRawX/Y()
в MotionEvent попадать внутрь этого прямоугольника, когда я получу действие ACTION_UP
.
Я понимаю, что я могу вызвать getLeft/Right/Top/Bottom()
в представлении целевой точки, но они относятся к родительскому контейнеру. Кажется, мне нужно знать "реальные" или "необработанные" значения, поэтому я могу сравнить их с необработанными x, y в MotionEvent.
Ответы
Ответ 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);
}