2017-07-28 71 views
0

我有一個TextView,並在上面有一個滑動偵聽器。我想添加一個長按聽衆。它們都可以工作,但是當我滑動時,也會觸發長按聆聽器,這不是我想要的。我需要他們獨立。我發現了一些關於檢測長按的very old code,但不清楚什麼是最好的方法。Android - 刷卡/ onLongClick衝突

這裏就是我在我的MainActivity

tvIta.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) { 
       @Override 
       public void onSwipeRight() {changeSays(); } 
       @Override 
       public void onSwipeLeft() { changeSays(); } 
      }); 

tvIta.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       String label = "Label_Ita"; 
       String text = tvIta.getText().toString(); 
       ClipboardManager clipboard = (ClipboardManager) getSystemService(MainActivity.this.CLIPBOARD_SERVICE); 
       ClipData clip = ClipData.newPlainText(label, text); 
       clipboard.setPrimaryClip(clip); 
       Toast.makeText(MainActivity.this, "Copied to clipboard!", Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
     }); 

這是刷卡監聽器類

public class OnSwipeTouchListener implements View.OnTouchListener { 

    private final GestureDetector gestureDetector; 

    public OnSwipeTouchListener(Context context) { 
     gestureDetector = new GestureDetector(context, new GestureListener()); 
    } 

    public void onSwipeLeft() { 
    } 

    public void onSwipeRight() { 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener { 

     private static final int SWIPE_DISTANCE_THRESHOLD = 100; 
     private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

// commented out otherwise won't work 
//  @Override 
//  public boolean onDown(MotionEvent e) { 
//   return true; 
//  } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      float distanceX = e2.getX() - e1.getX(); 
      float distanceY = e2.getY() - e1.getY(); 
      if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
       if (distanceX > 0) 
        onSwipeRight(); 
       else 
        onSwipeLeft(); 
       return true; 
      } 
      return false; 
     } 
    } 
} 

謝謝!

+1

我會考慮測試,看看哪些事件先觸發,並可能存儲一個布爾狀態並與相反的偵聽器消耗它。只是一個想法。我很樂意詳細說明,如果沒有人在頭頂上有明確的答案。 – anomeric

回答

0

嘗試使用布爾值來同步兩個事件。下面的代碼是一個例子:

boolean swiped = false; 
boolean clicked = false; 

tvIta.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) { 
      @Override 
      public void onSwipeRight() { 
       if(!clicked) { 
        swiped = true; 
        changeSays(); 
       } 
      } 
      @Override 
      public void onSwipeLeft() { 
       if(!clicked) { 
        swiped = true; 
        changeSays(); 
       } 
      } 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if(event.getAction() == MotionEvent.ACTION_UP) { 
        swiped = false; 
        clicked = false; 
       } 
       return super(v, event); 
      } 
     }); 

tvIta.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       if(!swiped) { 
        clicked = true; 
        String label = "Label_Ita"; 
        String text = tvIta.getText().toString(); 
        ClipboardManager clipboard = (ClipboardManager) getSystemService(MainActivity.this.CLIPBOARD_SERVICE); 
        ClipData clip = ClipData.newPlainText(label, text); 
        clipboard.setPrimaryClip(clip); 
        Toast.makeText(MainActivity.this, "Copied to clipboard!", Toast.LENGTH_SHORT).show(); 
       } 
       return true; 
      } 
     }); 
+0

這可行,但有一個問題,刷卡後,第一次長按不會被檢測到。刷卡後,需要第一次觸摸(不做任何事情),然後檢測到以下長按 –