title: How do I find out if user swipe started from bottom edge of the screen in android?
body: <p>I need to show a custom view if user swipe from bottom edge of the screen towards up.I have implemented SimpleOnGestureListener for finding out the swipe direction but I am stuck how to find if user started the swipe from bottom edge or not?My code is : </p>
  
  <pre><code>public class SimpleGestureFilter extends SimpleOnGestureListener{
  
      public final static String TAG    = "SimpleOnGestureListener";
  
      public final static int SWIPE_UP    = 1;
      public final static int SWIPE_DOWN  = 2;
      public final static int SWIPE_LEFT  = 3;
      public final static int SWIPE_RIGHT = 4;
  
      public final static int MODE_TRANSPARENT = 0;
      public final static int MODE_SOLID       = 1;
      public final static int MODE_DYNAMIC     = 2;
  
      private final static int ACTION_FAKE = -13; //just an unlikely number
      private int swipe_Min_Distance = 50; //100
      private int swipe_Max_Distance = 1350; //350
      private int swipe_Min_Velocity = 50; //100
  
      private int mode      = MODE_DYNAMIC;
      private boolean running = true;
      private boolean tapIndicator = false;
  
      private Activity context;
      private GestureDetector detector;
      private SimpleGestureListener listener;
  
      public SimpleGestureFilter(Activity context,SimpleGestureListener sgl) {
  
          this.context = context;
          this.detector = new GestureDetector(context, this);
          this.listener = sgl;
      }
  
      public void onTouchEvent(MotionEvent event){
  
          if(!this.running)
              return;  
  
          boolean result = this.detector.onTouchEvent(event); 
  
          if(this.mode == MODE_SOLID)
              event.setAction(MotionEvent.ACTION_CANCEL);
          else if (this.mode == MODE_DYNAMIC) {
  
              if(event.getAction() == ACTION_FAKE)
                  event.setAction(MotionEvent.ACTION_UP);
              else if (result)
                  event.setAction(MotionEvent.ACTION_CANCEL);
              else if(this.tapIndicator){
                  event.setAction(MotionEvent.ACTION_DOWN);
                  this.tapIndicator = false;
              }
  
          }
          //else just do nothing, it's Transparent
      }
  
      public void setMode(int m){
          this.mode = m;
      }
  
      public int getMode(){
          return this.mode;
      }
  
      public void setEnabled(boolean status){
          this.running = status;
      }
  
      public void setSwipeMaxDistance(int distance){
          this.swipe_Max_Distance = distance;
      }
  
      public void setSwipeMinDistance(int distance){
          this.swipe_Min_Distance = distance;
      }
  
      public void setSwipeMinVelocity(int distance){
          this.swipe_Min_Velocity = distance;
      }
  
      public int getSwipeMaxDistance(){
          return this.swipe_Max_Distance;
      }
  
      public int getSwipeMinDistance(){
          return this.swipe_Min_Distance;
      }
  
      public int getSwipeMinVelocity(){
          return this.swipe_Min_Velocity;
      }
  
      @Override
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
              float velocityY) {
  
          final float xDistance = Math.abs(e1.getX() - e2.getX());
          final float yDistance = Math.abs(e1.getY() - e2.getY());
          //e1.
          Log.i(TAG, "X: "+ Math.abs(e1.getX()));
          Log.i(TAG, "X1: "+ e2.getX());
          Log.i(TAG, "Y: "+ e1.getY());
          Log.i(TAG, "Y1: "+ e1.getY());
          Log.i(TAG, "edge: "+ e1.getEdgeFlags());
  
          if(xDistance &gt; this.swipe_Max_Distance || yDistance &gt; this.swipe_Max_Distance)
              return false;
  
          velocityX = Math.abs(velocityX);
          velocityY = Math.abs(velocityY);
          boolean result = false;
  
          if(velocityX &gt; this.swipe_Min_Velocity &amp;&amp; xDistance &gt; this.swipe_Min_Distance){
              if(e1.getX() &gt; e2.getX()) // right to left
              this.listener.onSwipe(SWIPE_LEFT);
              else
                  this.listener.onSwipe(SWIPE_RIGHT);
  
              result = true;
          }
          else if(velocityY &gt; this.swipe_Min_Velocity &amp;&amp; yDistance &gt; this.swipe_Min_Distance){
              if(e1.getY() &gt; e2.getY()) // bottom to up
                  this.listener.onSwipe(SWIPE_UP);
              else
                  this.listener.onSwipe(SWIPE_DOWN);
  
              result = true;
          }
  
          return result;
      }
  
      @Override
      public boolean onSingleTapUp(MotionEvent e) {
          this.tapIndicator = true;
          return false;
      }
  
      @Override
      public boolean onDoubleTap(MotionEvent arg0) {
          this.listener.onDoubleTap();;
          return true;
      }
  
      @Override
      public boolean onDoubleTapEvent(MotionEvent arg0) {
          return true;
      }
  
      @Override
      public boolean onSingleTapConfirmed(MotionEvent arg0) {
  
          if(this.mode == MODE_DYNAMIC){        // we owe an ACTION_UP, so we fake an
              arg0.setAction(ACTION_FAKE);      //action which will be converted to an ACTION_UP later.
              this.context.dispatchTouchEvent(arg0);
          }   
  
          return false;
      }
  
      public static interface SimpleGestureListener{
          void onSwipe(int direction);
          void onDoubleTap();
      }
  
  }
  </code></pre>