在拖动时不调用onTouch()ACTION_MOVE大小写

时间:2015-01-27 08:57:08

标签: android ontouchlistener

我有一个正在听我的触摸的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;
    }

1 个答案:

答案 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;
}