Swipe listeners in Android

前端 未结 4 1303
無奈伤痛
無奈伤痛 2021-02-08 09:49

Is there something like onLeftSwipeListener and onRightSwipeListener in Android? I want to switch views swiping finger back and forward. I use a FrameLayout and an ImageView ins

4条回答
  •  醉话见心
    2021-02-08 10:15

    i have made a small example of swiper in android i would like share the code with you.

    Chek this.

    //LAYOUT///

    
    
    
        
    
            
    
            
    
            
    
            
        
    
    
    

    ///ACTIVITY///

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.GestureDetector;
    import android.view.GestureDetector.SimpleOnGestureListener;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.animation.AccelerateInterpolator;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    import android.widget.ViewFlipper;
    
    public class SwipeActivity extends Activity {
    
        private Animation mInFromRight;
        private Animation mOutToLeft;
        private Animation mInFromLeft;
        private Animation mOutToRight;
        private ViewFlipper mViewFlipper;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            mViewFlipper = (ViewFlipper) findViewById(R.id.view_flipper);
            mViewFlipper.setDisplayedChild(0);
            initAnimations();
        }
    
        private void initAnimations() {
            mInFromRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT,
                    +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f);
            mInFromRight.setDuration(500);
            AccelerateInterpolator accelerateInterpolator = new AccelerateInterpolator();
            mInFromRight.setInterpolator(accelerateInterpolator);
    
            mInFromLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT,
                    -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f);
            mInFromLeft.setDuration(500);
            mInFromLeft.setInterpolator(accelerateInterpolator);
    
            mOutToRight = new TranslateAnimation(Animation.RELATIVE_TO_PARENT,
                    0.0f, Animation.RELATIVE_TO_PARENT, +1.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f);
            mOutToRight.setDuration(500);
            mOutToRight.setInterpolator(accelerateInterpolator);
    
            mOutToLeft = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, -1.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f,
                    Animation.RELATIVE_TO_PARENT, 0.0f);
            mOutToLeft.setDuration(500);
            mOutToLeft.setInterpolator(accelerateInterpolator);
    
            final GestureDetector gestureDetector;
            gestureDetector = new GestureDetector(new MyGestureDetector());
    
            mViewFlipper.setOnTouchListener(new OnTouchListener() {
    
                public boolean onTouch(View v, MotionEvent event) {
                    if (gestureDetector.onTouchEvent(event)) {
                        return false;
                    } else {
                        return true;
                    }
                }
            });
        }
    
        private class MyGestureDetector extends SimpleOnGestureListener {
    
            private static final int SWIPE_MIN_DISTANCE = 120;
            private static final int SWIPE_MAX_OFF_PATH = 250;
            private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                    float velocityY) {
                System.out.println(" in onFling() :: ");
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    mViewFlipper.setInAnimation(mInFromRight);
                    mViewFlipper.setOutAnimation(mOutToLeft);
                    mViewFlipper.showNext();
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    mViewFlipper.setInAnimation(mInFromLeft);
                    mViewFlipper.setOutAnimation(mOutToRight);
                    mViewFlipper.showPrevious();
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        }
    }
    

提交回复
热议问题