2017-07-28 7 views
0

Ich habe eine TextView mit einem Swipe-Listener darauf. Ich wollte auch einen Long-Click-Listener hinzufügen. Sie funktionieren beide, aber wenn ich wische, wird auch der Long-Click-Listener ausgelöst, was ich nicht möchte. Ich brauche sie, um unabhängig zu sein. Ich habe einige very old code über die Erkennung von langen drücken gefunden, aber es ist nicht sehr klar, was der beste Ansatz ist.Android - swipe/onLongClick Konflikt

hier ist, was ich in meinem MainActivity

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; 
     } 
    } 
} 

Danke

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; 
      } 
     }); 

Dies ist die Swipe-Listener-Klasse haben!

+1

Ich würde testen, um zu sehen, welches Ereignis zuerst ausgelöst wird und möglicherweise einen Zustand in einem booleschen Zustand speichern und mit dem gegenüberliegenden Listener konsumieren. Nur ein Gedanke. Ich würde gerne erklären, ob niemand eine endgültige Antwort von oben hat. – anomeric

Antwort

0

Versuchen Sie, beide Ereignisse mit booleschen Werten zu synchronisieren. Der folgende Code ist ein Beispiel:

+0

Dies funktioniert, aber es gibt ein Problem, bei dem nach einem Streichen der erste lange Druckvorgang nicht erkannt wird. Nach einem Wischvorgang muss das erste Mal berührt werden (tut nichts) und dann wird das folgende lange Drücken erkannt –