当拖动时,onTouch() ACTION_MOVE案例未被调用

4

我有一个ImageView监听我的触摸事件。在ACTION_DOWN情况下,我正在拖拽图像。我能够拖动它,但无法检测到移动事件,因为该事件从未被调用。

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

可能是[Android (x,y)连续触摸(拖动)坐标]的重复问题。 - sled
不是的,这不是重复的问题,当我没有使用那个DragShadowBuilder时,ACTION_MOVE被成功调用。我猜想DragShadowBuilder引起了一些我不知道的问题。 - kaddy
抱歉,我希望我的答案能解决这个问题。 - sled
1个回答

2
事实上,startDrag(...) 会阻止您的 View 接收后续的触摸事件。似乎一旦拖放开始,就会创建一个覆盖整个屏幕并消耗所有触摸事件的覆盖层。只有拖动事件将被发送到屏幕上所有视图。
这可以在 startDrag 的文档中找到:

系统获得拖影后,通过向应用程序中当前可见的所有 View 对象发送拖动事件来开始拖放操作。它可以通过调用 View 对象的拖动侦听器(onDrag() 的实现)或调用 View 对象的 onDragEvent() 方法来完成。两者都传递了一个 DragEvent 对象,该对象具有 ACTION_DRAG_STARTED 的 getAction() 值。

如何处理拖动事件可以在文档的此部分找到: 拖放 - 在拖动期间处理事件 尝试扩展您现有的代码以捕获拖动事件:
// 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;
}

我在DragEvent.ACTION_DRAG_ENTERED中调整了我的代码。但我认为上面的代码片段应该可以工作。谢谢 :) - kaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接