2017-07-28 70 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

这可行,但有一个问题,刷卡后,第一次长按不会被检测到。刷卡后,需要第一次触摸(不做任何事情),然后检测到以下长按 –