final Rect r = mDragRect; final int count = container.getChildCount(); final int scrolledX = x + container.getScrollX(); final int scrolledY = y + container.getScrollY(); final View ignoredDropTarget = mIgnoredDropTarget; for (int i = count - 1; i >= 0; i--) { final View child = container.getChildAt(i); if (child.getVisibility() == VISIBLE && child != ignoredDropTarget) { child.getHitRect(r); if (r.contains(scrolledX, scrolledY)) { DropTarget target = null; if (child instanceof ViewGroup) { x = scrolledX - child.getLeft(); y = scrolledY - child.getTop(); target = findDropTarget((ViewGroup) child, x, y, dropCoordinates); } if (target == null) { if (child instanceof DropTarget) { // Only consider this child if they will accept DropTarget childTarget = (DropTarget) child; if (childTarget.acceptDrop(mDragSource, x, y, 0, 0, mDragInfo)) { dropCoordinates[0] = x; dropCoordinates[1] = y; return (DropTarget) child; } else { return null; } } } else { return target; } } } } return null; 这是拖拽目标的选择,不断地减小选择区域,最终放下,拖拽有拖拽源,和拖拽的action还有就是 最后的落点,因为android的界面是已经被网格化了的!所以代码中定义了 最终的那个RECT用于获取最终发下的网格坐标!
这个例子就是你想要的效果。
实验了下,应该就是桌面拖动效果的一个小demo!
final int count = container.getChildCount();
final int scrolledX = x + container.getScrollX();
final int scrolledY = y + container.getScrollY();
final View ignoredDropTarget = mIgnoredDropTarget; for (int i = count - 1; i >= 0; i--)
{
final View child = container.getChildAt(i);
if (child.getVisibility() == VISIBLE && child != ignoredDropTarget) {
child.getHitRect(r);
if (r.contains(scrolledX, scrolledY)) {
DropTarget target = null;
if (child instanceof ViewGroup) {
x = scrolledX - child.getLeft();
y = scrolledY - child.getTop();
target = findDropTarget((ViewGroup) child, x, y, dropCoordinates);
}
if (target == null) {
if (child instanceof DropTarget) {
// Only consider this child if they will accept
DropTarget childTarget = (DropTarget) child;
if (childTarget.acceptDrop(mDragSource, x, y, 0, 0, mDragInfo)) {
dropCoordinates[0] = x;
dropCoordinates[1] = y;
return (DropTarget) child;
} else {
return null;
}
}
} else {
return target;
}
}
}
} return null;
这是拖拽目标的选择,不断地减小选择区域,最终放下,拖拽有拖拽源,和拖拽的action还有就是 最后的落点,因为android的界面是已经被网格化了的!所以代码中定义了 最终的那个RECT用于获取最终发下的网格坐标!