2012-03-16 81 views
0

我的程序創建可擴展的列表,我已經實現了滑動 - 但我無法弄清楚如何添加雙擊。Android ExpandableLists&添加DoubleTap手勢,如何添加偵聽器?

首先,我list= getExpandableListView();

我的主類中,我實現刷卡使用下面的代碼:

final ActivitySwipeDetector swipeDetector = new ActivitySwipeDetector(); 


     list.setOnTouchListener(swipeDetector); 

     list.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
         if (swipeDetector.swipeDetected()){ 
          // do the onSwipe action 
         } else { 
          // do the onItemClick action 
         } 
        } 
           }); 


      list.setOnItemLongClickListener(new OnItemLongClickListener() { 
       public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) { 
        if (swipeDetector.swipeDetected()){ 
         // do the onSwipe action 
         return true; 
        } else { 
         // do the onItemLongClick action 
         return false; 
        } 
       } 
      }); 

而且我做了一個類,它是我的刷卡探測器:

public class ActivitySwipeDetector implements View.OnTouchListener { 

public static enum Action { 
    LR, // Left to Right 
    RL, // Right to Left 
    TB, // Top to bottom 
    BT, // Bottom to Top 
    None // when no action was detected 
} 


private static final String logTag = "SwipeDetector"; 
private static final int MIN_DISTANCE = 100; 
private float downX, downY, upX, upY; 
private Action mSwipeDetected = Action.None; 


public boolean swipeDetected(){ 
    return mSwipeDetected != Action.None; 
} 

public Action getAction(){ 
    return mSwipeDetected; 
} 



public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: { 
     downX = event.getX(); 
     downY = event.getY(); 
     mSwipeDetected = Action.None; 
     return false; // allow other events like Click to be processed 
    } 
    case MotionEvent.ACTION_UP: { 
     upX = event.getX(); 
     upY = event.getY(); 

     float deltaX = downX - upX; 
     float deltaY = downY - upY; 

     // horizontal swipe detection 
       if (Math.abs(deltaX) > MIN_DISTANCE) { 
        // left or right 
        if (deltaX < 0) { 
         Log.i(logTag, "Swipe Left to Right"); 
         mSwipeDetected = Action.LR; 
         return false; 
        } 
        if (deltaX > 0) { 
         Log.i(logTag, "Swipe Right to Left"); 
         mSwipeDetected = Action.RL; 
         return false; 
        } 
       } else 

       // vertical swipe detection 
       if (Math.abs(deltaY) > MIN_DISTANCE) { 
        // top or down 
        if (deltaY < 0) { 
         Log.i(logTag, "Swipe Top to Bottom"); 
         mSwipeDetected = Action.TB; 
         return false; 
        } 
        if (deltaY > 0) { 
         Log.i(logTag, "Swipe Bottom to Top"); 
         mSwipeDetected = Action.BT; 
         return false; 
        } 
       } 
       return false; 
    } 
    } 
    return false; 
} 

}

什麼我添加使程序d雙擊雙擊? 我曾嘗試以下添加到我的刷卡類:

public boolean onDoubleTap(MotionEvent e) { 
    float x = e.getX(); 
    float y = e.getY(); 

    Log.d("Double Tap", "Tapped at: (" + x + "," + y + ")"); 

    return true; 
} 

但林不知道如何添加監聽器爲它的主類..

這只是給我的錯誤「名單.setOnDoubleTapListener」和 「新onDoubleTapListener」 ..

list.setOnDoubleTapListener(new OnDoubleTapListener(){ 
       public boolean onDoubleTap(MotionEvent e) { 

        return false; 
       } 
       public boolean onDoubleTapEvent(MotionEvent e) { 
        // viewA.setText("-" + "onDoubleTapEvent" + "-"); 
        return false; 
       } 
       public boolean onSingleTapConfirmed(MotionEvent e) { 
        //viewA.setText("-" + "onSingleTapConfirmed" + "-"); 
        return false; 
       } 

     }); 

請幫助

Z.

回答

1

解決上述問題:

添加以下的滑動檢測器類:private static final int MIN_DISTANCE = 100; private float downX, downY, upX, upY; private Action mSwipeDetected = Action.None; private long lastTouchTime = -1;

已將此添加到ActionDown

case MotionEvent.ACTION_DOWN: { 

     downX = event.getX(); 
     downY = event.getY(); 
     mSwipeDetected = Action.None; 


     long thisTime = System.currentTimeMillis(); 

     if (thisTime - lastTouchTime < 250) { 

      // Double click 
     // p = mapView.getProjection().fromPixels((int) e.getX(), (int) e.getY()); 
      lastTouchTime = -1; 
      Log.i(logTag, "DOUBLE TAP"); 
     } else { 
      // too slow 
      lastTouchTime = thisTime; 
     } 


     return false; // allow other events like Click to be processed 

    }