2012-12-19 35 views
0

我需要在列表視圖上右鍵滑動Longclick和Left &並獲取執行操作的列表項。 This方法似乎很有前途。 問題: 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; 
     } 

    } 

回答

1

我種使用黑客來解決我的issue.What情況是因爲事件被消耗掉,我從來沒有得到的結果在onitemclick事件。我所做的就是在檢測到滑動動作後觸發我自己的向下和向上事件,並在這些假事件中返回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'是事件必須被觸發的視圖,在我的情況下它是listview。 由於我們沒有它,它必須通過swipeDetector類的構造函數傳入。如下:

ListView v; 
SwipeDetector(ListView lv) 
{ 
    this.v=lv; 
} 
相關問題