作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 OnDragListener
时遇到了一个奇怪的问题。我的目标 View 很好地获取了 ACTION_DROP
事件并对其进行了处理;但它从不接收 ACTION_DRAG_STARTED
或 ACTION_DRAG_ENDED
事件(事实上它从不接收除 drop 之外的任何事件)。
这可能是什么原因造成的?这是一个问题,因为我无法处理掉落发生在目标之外的情况。
我找到了 this question但我不清楚答案。非常感谢任何想法。
我的可拖动 View 有这个 OnTouchListener
:
@Override
public boolean onTouch(View v, MotionEvent ev) {
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
startPointX = ev.getX();
startPointY = ev.getY();
isOnClick = true;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (isOnClick) {
isOnClick = false;
// handle single click
}
break;
case MotionEvent.ACTION_MOVE:
if (isOnClick && movePassesThreshold(ev)) {
isOnClick = false;
draggableView.startDrag(...);
}
break;
default:
break;
}
return true;
}
目标 View 有这个OnDragListener
:
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
Log.v(TAG, "drag started");
break;
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DROP:
Log.v(TAG, "drop");
// handle drop
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.v(TAG, "drag ended");
break;
default:
return false;
}
return true;
}
最佳答案
这是 ViewGroup 的一个已知问题:
https://code.google.com/p/android/issues/detail?id=25073
按照该链接中的建议覆盖 dispatchDragEvent 函数对我有用:
@Override
public boolean dispatchDragEvent(DragEvent ev){
boolean r = super.dispatchDragEvent(ev);
if (r && (ev.getAction() == DragEvent.ACTION_DRAG_STARTED
|| ev.getAction() == DragEvent.ACTION_DRAG_ENDED)){
// If we got a start or end and the return value is true, our
// onDragEvent wasn't called by ViewGroup.dispatchDragEvent
// So we do it here.
onDragEvent(ev);
}
return r;
}
关于android - OnDragListener 未收到 DRAG_STARTED 或 DRAG_ENDED,但收到 ACTION_DROP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410949/
我在使用 OnDragListener 时遇到了一个奇怪的问题。我的目标 View 很好地获取了 ACTION_DROP 事件并对其进行了处理;但它从不接收 ACTION_DRAG_STARTED 或
我是一名优秀的程序员,十分优秀!