Android swipe left and right in RelativeLayout
15,477
Solution 1
You just need an OnTouchListener, that should be all for simple answer. Take a look. I used this code in some working project, so everything should work fine. But let me know if there is something missing and doesn't work.
yourRelativeLayout.setOnTouchListener(new OnTouchListener() {
int downX, upX;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
downX = (int) event.getX();
Log.i("event.getX()", " downX " + downX);
return true;
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
upX = (int) event.getX();
Log.i("event.getX()", " upX " + upX);
if (upX - downX > 100) {
// swipe right
}
else if (downX - upX > -100) {
// swipe left
}
return true;
}
return false;
}
});
Solution 2
Try this will help you....
OnSwipeTouchListener.java:
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector gestureDetector;
public OnSwipeTouchListener (Context ctx){
gestureDetector = new GestureDetector(ctx, new GestureListener());
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onSwipeRight() {
}
public void onSwipeLeft() {
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
}
Usage:
imageView.setOnTouchListener(new OnSwipeTouchListener() {
public void onSwipeTop() {
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}
public void onSwipeRight() {
Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show();
}
public void onSwipeLeft() {
Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
Author by
user3804530
Updated on June 04, 2022Comments
-
user3804530 about 2 years
I am trying to implement swipe left or right in my RelativeLayout. I wrote some code but could not get swipe left or right working. I am using GestureDetector this is a my source
private GestureDetector gesturedetector = null; private RelativeLayout swipelayout; @SuppressLint("UseValueOf") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.strada_menu_result_loadmore, container, false); swipelayout = (RelativeLayout) rootView.findViewById(R.id.swipelayout); gesturedetector = new GestureDetector(new MyGestureListener()); swipelayout.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { gesturedetector.onTouchEvent(event); return true; } }); return rootView; } public boolean dispatchTouchEvent(MotionEvent ev){ return gesturedetector.onTouchEvent(ev); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final int SWIPE_MIN_DISTANCE = 150; private static final int SWIPE_MAX_OFF_PATH = 100; private static final int SWIPE_THRESHOLD_VELOCITY = 100; @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float dX = e2.getX() - e1.getX(); float dY = e1.getY() - e2.getY(); if (Math.abs(dY) >= SWIPE_THRESHOLD_VELOCITY && Math.abs(velocityX) >= SWIPE_THRESHOLD_VELOCITY && Math.abs(dX) >= SWIPE_MIN_DISTANCE) { if (dX > 0) { Toast.makeText(getActivity(), "Right Swipe", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), "Left Swipe", Toast.LENGTH_SHORT).show(); } return true; } return false; } }
what am i doing wrong? if anyone knows solution please help me thanks
-
andriosr almost 10 yearsThe same answer you gave is available here: stackoverflow.com/questions/4139288/…. You could have suggested the solution through the link or improve it making a better explanation.
-
user3804530 almost 10 yearsi have syntacs error in setOnTouchListener method can you changed your code sir ?
-
user3804530 almost 10 years@yashwanth how i can write setOnTouchListener method at the moment ?
-
user3804530 almost 10 yearsthis is wrong answer sir. i can not swipe my layout
-
Prachi over 9 yearsit not only works for left, but also for 'up' how to restrict 'up'?
-
osayilgan over 9 yearsThis code up there doesn't take care of Y coordinate. What it basically does is, gets the X coordinate when you first touch on the screen (downX), and gets the X coordinate again when you release your finger (upX). Then it compares these two values to understand which direction your finger moves to. To block "UP" (Meaning +Y Direction), you will need to add downY and upY values, just like X up there. then you can compare these two values, and return false, if you don't that action to be considered.
-
osayilgan over 9 yearsAnd you can also, change the threshold value, from 100 to something bigger. Then you can ignore small X direction changes, when you move your finger in down-up direction.
-
Ashish Sahu over 9 yearsl'll edited answer...now try this answer you guys I'm sure it is working right now...
-
rosu alin almost 9 yearsit should be: if (upX - downX > 100* Constants.density) { } else if (downX - upX > 100 * Constants.density) { } U we're changing the order of the upX - downX and also adding the - to 100 which is incorrect. Right? I mean I took out the - from 100 and it works fine now, doesn't take the Y coordinate, doesn't swipe left at everything I do
-
osayilgan almost 9 yearsWhat the code above does is, finds the difference in X coordinates. Between the one when you touch to screen and the one when you release it,
down
andup
. 100 is the minimum change in the X coordinate. It won't detect the gesture if the difference is less than 100 in X.