Android: How to handle right to left swipe gestures

前端 未结 22 1197
日久生厌
日久生厌 2020-11-21 06:18

I want my app to recognize when a user swipes from right to left on the phone screen.

How to do this?

22条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-21 07:18

    You don't need complicated calculations. It can be done just by using OnGestureListener interface from GestureDetector class.

    Inside onFling method you can detect all four directions like this:

    MyGestureListener.java:

    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    
    public class MyGestureListener implements GestureDetector.OnGestureListener{
    
        private static final long VELOCITY_THRESHOLD = 3000;
    
        @Override
        public boolean onDown(final MotionEvent e){ return false; }
    
        @Override
        public void onShowPress(final MotionEvent e){ }
    
        @Override
        public boolean onSingleTapUp(final MotionEvent e){ return false; }
    
        @Override
        public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX,
                            final float distanceY){ return false; }
    
        @Override
        public void onLongPress(final MotionEvent e){ }
    
        @Override
        public boolean onFling(final MotionEvent e1, final MotionEvent e2,
                           final float velocityX,
                           final float velocityY){
    
            if(Math.abs(velocityX) < VELOCITY_THRESHOLD 
                        && Math.abs(velocityY) < VELOCITY_THRESHOLD){
                return false;//if the fling is not fast enough then it's just like drag
            }
    
            //if velocity in X direction is higher than velocity in Y direction,
            //then the fling is horizontal, else->vertical
            if(Math.abs(velocityX) > Math.abs(velocityY)){
                if(velocityX >= 0){
                    Log.i("TAG", "swipe right");
                }else{//if velocityX is negative, then it's towards left
                    Log.i("TAG", "swipe left");
                }
            }else{
                if(velocityY >= 0){
                    Log.i("TAG", "swipe down");
                }else{
                    Log.i("TAG", "swipe up");
                }
            }
    
            return true;
        }
    }
    

    usage:

    GestureDetector mDetector = new GestureDetector(MainActivity.this, new MyGestureListener());
    
    view.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public boolean onTouch(final View v, final MotionEvent event){
            return mDetector.onTouchEvent(event);
        }
    });
    

提交回复
热议问题