0

我需要在列表视图上实现 Longclick 和左右滑动并获取执行操作的列表项。这种方法看起来很有前途。问题: 1.ACTION_MOVE 在开始时只触发一次,因此差异非常小 2.如果我在开关中使用默认值,我会得到最后一个位置,但永远不会触发 onClick 或 onLongClick。这是我尝试过的.. 是否可以触发假动作以导致 itemClick/itemlongclick 执行。

public boolean onTouch(View v, MotionEvent event) 
    {
        switch (event.getAction()) 
        {
        case MotionEvent.ACTION_DOWN: 
            downX = event.getX();
            downY = event.getY();
            mSwipeDetected = Action.NONE;
            Log.i("MyTags","Down Event");
            Log.i("MyTags",String.valueOf(downX)+","+String.valueOf(downY));
            return false; // allow other events like Click to be processed
        case MotionEvent.ACTION_MOVE: 
            upX = event.getX();
            upY = event.getY();
            Log.i("MyTags","Move Event");
            Log.i("MyTags",String.valueOf(upX)+","+String.valueOf(upY));
            moveEnabled=true;
            return false;
        case MotionEvent.ACTION_UP:
            upX = event.getX();
            upY = event.getY();
            Log.i("MyTags","UP Event");
            Log.i("MyTags",String.valueOf(upX)+","+String.valueOf(upY));
            return false;
        default:
            upX = event.getX();
            upY = event.getY();
            Log.i("MyTags","Default Event");
            Log.i("MyTags",String.valueOf(upX)+","+String.valueOf(upY));
            if(moveEnabled)
            {
                diffX=downX-upX;
                diffY=downY-upY;
                abs_X=Math.abs(diffX);
                abs_Y=Math.abs(diffY);

                moveEnabled=false;
                if((abs_X>abs_Y)&(abs_X>MINIMUM_X))
                {
                    if(diffX>0)
                    {
                        mSwipeDetected=Action.LEFT;
                        Log.i("MyTags","Left Swipe");
                        event.setAction(MotionEvent.ACTION_UP);
                        return false;
                    }
                    else if(diffX<0)
                    {
                        mSwipeDetected=Action.RIGHT;
                        Log.i("MyTags","Right Swipe");
                        event.setAction(MotionEvent.ACTION_UP);
                        return false;
                    }
                }
            }
            return false;
        }

    }
4

1 回答 1

1

我有点用黑客来解决我的问题。发生的事情是因为事件被消耗,我从来没有在 onitemclick 事件中得到结果。我所做的是在检测到滑动操作后触发我自己的 Down 和 Up 事件,并且在这些虚假事件期间我返回 false 以便将其传递给 itemclick 侦听器。我们需要在这里小心一点,因为事件似乎从结果中读取了 2 次,为此我打开和关闭侦听器,在那里包含输出。

ACTION_MOVE:
 //when swipe is detected fire a fake down event
 event.setAction(MotionEvent.ACTION_DOWN);
 v.dispatchTouchEvent(event);
ACTION_DOWN:
  if(fake down event)
     //set some flags & dispatch fake event
     event.setAction(MotionEvent.ACTION_UP);
     v.dispatchTouchEvent(event);
     return false
   else do regular handling
ACTION_UP:
    if fake down event
       dispatch fake up event
    else ..

这里的“v”是必须触发事件的视图,在我的例子中是列表视图。由于我们没有立即使用它,因此必须通过 swipeDetector 类的构造函数传入。如下..

ListView v;
SwipeDetector(ListView lv)
{
    this.v=lv;
}
于 2012-12-25T12:36:25.270 回答