我想知道如何將視圖從一個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