我正在为Android应用程序实施拖放操作。为了知道drop是否发生在drop target中,我需要知道drop target视图的边界矩形。然后,当我得到getRawX/Y()
动作时,我会看到MotionEvent中的ACTION_UP
是否属于此矩形。
我意识到我可以在放置目标视图上调用getLeft/Right/Top/Bottom()
,但这些是相对于父容器的。我似乎需要知道“真实”或原始值,以便我可以将它们与MotionEvent中的原始x,y进行比较。
答案 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)
这里是扩展获取程序的组合,您可以添加它们以快速获得任何视图的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)