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!
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