package com.aviary.android.feather.widget; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; /** * acts a an swipe gesture overylay for a view */ public class SwipeView extends View { public static interface OnSwipeListener { // allow classes to implement as they wish when they overlay a SwipeView public void onSwipe( boolean leftToRight ); } 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; private OnSwipeListener mOnSwipeListener; View.OnTouchListener gestureListener; private GestureDetector gestureDetector; public SwipeView( Context context ) { super( context ); // TODO Auto-generated constructor stub gestureDetector = new GestureDetector( new SwipeDetector() ); gestureListener = new View.OnTouchListener() { public boolean onTouch( View v, MotionEvent event ) { return gestureDetector.onTouchEvent( event ); } }; this.setOnTouchListener( gestureListener ); } public SwipeView( Context context, AttributeSet attrs ) { super( context, attrs ); // TODO Auto-generated constructor stub gestureDetector = new GestureDetector( new SwipeDetector() ); gestureListener = new View.OnTouchListener() { public boolean onTouch( View v, MotionEvent event ) { return gestureDetector.onTouchEvent( event ); } }; this.setOnTouchListener( gestureListener ); } public SwipeView( Context context, AttributeSet attrs, int defStyle ) { super( context, attrs, defStyle ); // TODO Auto-generated constructor stub gestureDetector = new GestureDetector( new SwipeDetector() ); gestureListener = new View.OnTouchListener() { public boolean onTouch( View v, MotionEvent event ) { return gestureDetector.onTouchEvent( event ); } }; this.setOnTouchListener( gestureListener ); } public OnSwipeListener getOnSwipeListener() { return mOnSwipeListener; } public void setOnSwipeListener( OnSwipeListener swipeDetector ) { mOnSwipeListener = swipeDetector; } public class SwipeDetector extends SimpleOnGestureListener { @Override public boolean onDoubleTap( MotionEvent e ) { return false; } @Override public boolean onScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY ) { return false; } @Override public boolean onFling( MotionEvent e1, MotionEvent e2, float velocityX, float velocityY ) { try { if ( Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH ) return false; // right to left swipe if ( e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY ) { if ( mOnSwipeListener != null ) { mOnSwipeListener.onSwipe( false ); } } // left to right swipe else if ( e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY ) { if ( mOnSwipeListener != null ) { mOnSwipeListener.onSwipe( true ); } } } catch ( Exception e ) { // nothing } return false; } } }