我想知道如何将视图从一个ViewGroup移动到另一个ViewGroup,特别是在执行触摸事件时,如何检测子视图。有没有一种方法可以让我知道我“徘徊”了哪些视图?如何检测您在执行触摸事件时传递的视图?
我现在正在做的事情是,当我在我的视图中检测到一个ACTION_MOVE事件时,我将它提升到顶层父级,以便它可以在整个窗口内移动并绘制(而不仅仅是它的原始内部父边界),那么我想将视图移到不同的ViewGroup,并在ACTION_UP上将视图附加到该ViewGroup。
我想知道如何将视图从一个ViewGroup移动到另一个ViewGroup,特别是在执行触摸事件时,如何检测子视图。有没有一种方法可以让我知道我“徘徊”了哪些视图?如何检测您在执行触摸事件时传递的视图?
我现在正在做的事情是,当我在我的视图中检测到一个ACTION_MOVE事件时,我将它提升到顶层父级,以便它可以在整个窗口内移动并绘制(而不仅仅是它的原始内部父边界),那么我想将视图移到不同的ViewGroup,并在ACTION_UP上将视图附加到该ViewGroup。
我发现塞巴斯蒂安·罗斯的回答与资源非常有帮助的,但因为它是不是一个真正的答案对于我的问题,我想我会分享我的想法。
这里是我用来检测视图的代码(只接受一个下拉的视图)给出了屏幕上的坐标。
private DropView findDropTarget(int x, int y, int[] dropCoordinates){
final Rect r = mRectTemp;
final ArrayList<DropView> dropTargets = ((main) context).getBoardDropTargets();
final int count = dropTargets.size();
for (int i=count-1; i>=0; i--) {
final DropView target = dropTargets.get(i);
target.getHitRect(r);
target.getLocationOnScreen(dropCoordinates);
r.offset(dropCoordinates[0] - target.getLeft(), dropCoordinates[1] - target.getTop());
if (r.contains(x, y)) {
dropCoordinates[0] = x - dropCoordinates[0];
dropCoordinates[1] = y - dropCoordinates[1];
return target;
}
}
}
好了,第一关mRectTemp仅仅是一个分配的矩形,这样你就不必不断创造新的(IE最终矩形R =新的矩形())
下一行dropTargets是一个列表的观点,将接受我的应用程序下降。 接下来,我遍历每个视图。
然后我使用getHitRect(r)返回视图的屏幕坐标。
然后,我偏移coordiantes以考虑通知栏或任何其他视图,可能会取代coordiantes。
最后我看看如果x和y在给定矩形r(x和y是event.rawX()和event.rawY())的坐标内。
它实际上证明是更简单,然后预期和工作得很好。
阅读:
http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)
http://developer.android.com/reference/android/view/View.html#onTouchEvent(android.view.MotionEvent)
我已经建立了一个拖放使用方法丢弃。
我也强烈建议主屏幕源代码的读取,它包含这个东西(种):
https://android.googlesource.com/platform/packages/apps/Launcher2
我想我找到了一个更简单的方法来做到这一点。
private View findView(float x, float y, ArrayList<View> targets) { final int count = targets.size(); for (int i = 0; i < count; i++) { final View target = targets.get(i); if (target.getRight() > x && target.getTop() < y && target.getBottom() > y && target.getLeft() < x) { return target; } } return null; }
由阿美的反应启发,但发现那MotionEvent#getX()/ getY()与视图#getTop()/ etc返回坐标与父视图,我结束了以下操作屏幕坐标,允许我在整个ViewGroups工作:
private boolean inRegion(float x, float y, View v) {
v.getLocationOnScreen(mCoordBuffer);
return mCoordBuffer[0] + v.getWidth() > x && // right edge
mCoordBuffer[1] + v.getHeight() > y && // bottom edge
mCoordBuffer[0] < x && // left edge
mCoordBuffer[1] < y; // top edge
}
其使用的OnTouchListener里面例如: -
boolean inside = inRegion(event.getRawX(), event.getRawY(), targetView);
我的理解onInterceptTouchEvent只拦截事件,如果它是一个家长。这是正确的吗?因为在我的情况下,我将把视图放到ViewGroup中。该视图实际上是ViewGroup上方的一个级别。当我获得时间时,我会检查它。我还想知道,如果我可以通过查看event.getX()和event.getY()位置是否在放置目标ViewGroup中来检测哪些视图位于事件之下。 – Pzanno 2010-12-01 19:32:28
这里最有用的资源是指向Launcher2源代码的链接。我能够弄清楚如何检测屏幕上的坐标。 – Pzanno 2010-12-15 13:29:56