我有一个正在听我的触摸的ImageView。我在ACTION_DOWN案例中拖动Image。我能够拖动它但无法检测到移动事件,因为它从未被调用过。
card.setOnTouchListener(this); // inside onCreate()
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case (MotionEvent.ACTION_DOWN):
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(null, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
case (MotionEvent.ACTION_MOVE):
Log.v("pref", "sometimes");
return true;
}
return true;
}
答案 0 :(得分:2)
实际上,startDrag(...)
会阻止您的View接收更多触摸事件。看起来,只要拖放开始,就会创建覆盖图,覆盖整个屏幕并消耗所有触摸事件。只有拖动事件才会发送到屏幕上的所有视图。
这可以在startDrag
的文档中找到:
一旦系统出现拖动阴影,就会开始拖放 通过将拖动事件发送到您的所有View对象来进行操作 当前可见的应用程序。它通过调用来做到这一点 View对象的拖动侦听器(onDrag()或by的实现 调用View对象的onDragEvent()方法。两者都通过了 具有JOTION_DRAG_STARTED
的getAction()值的DragEvent对象
如何处理拖动事件可以在文档的这一部分找到:
Drag and Drop - Handling events during the drag
尝试扩展现有代码以捕获拖动事件:
// inside onCreate(), needs "implements View.OnDragListener"
card.setOnDragListener(this);
public boolean onDrag(View v, DragEvent event) {
// Defines a variable to store the action type for the incoming event
final int action = event.getAction();
// Handles each of the expected events
switch(action) {
case DragEvent.ACTION_DRAG_LOCATION:
final int x = event.getX();
final int y = event.getY();
Log.d("prefs", "X=" + String.valueOf(x) + " / Y=" + String.valueOf(y));
break;
}
return true;
}