Mega Code Archive

 
Categories / Android / User Event
 

Extends SimpleOnGestureListener

// package com.determinato.feeddroid.util;  /*      * Copyright 2010 John R. Hicks   *   *  Licensed under the Apache License, Version 2.0 (the "License");   *  you may not use this file except in compliance with the License.   *  You may obtain a copy of the License at   *   *      http://www.apache.org/licenses/LICENSE-2.0   *   *  Unless required by applicable law or agreed to in writing, software   *  distributed under the License is distributed on an "AS IS" BASIS,   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *  See the License for the specific language governing permissions and   *  limitations under the License.   */  import android.app.Activity;  import android.view.GestureDetector;  import android.view.MotionEvent;  import android.view.GestureDetector.SimpleOnGestureListener;  class GestureFilter extends SimpleOnGestureListener {    public static final int SWIPE_UP = 1;    public static final int SWIPE_DOWN = 2;    public static final int SWIPE_LEFT = 3;    public static final int SWIPE_RIGHT = 4;        public static final int MODE_TRANSPARENT = 0;    public static final int MODE_SOLID = 1;    public static final int MODE_DYNAMIC = 2;        private static final int ACTION_FAKE = -13;    private int swipe_min_distance = 100;    private int swipe_max_distance = 350;    private int swipe_min_velocity = 100;        private int mode = MODE_DYNAMIC;    private boolean running = true;    private boolean tapIndicator = false;        private Activity context;    private GestureDetector detector;    private SimpleGestureListener listener;        public GestureFilter(Activity activity, SimpleGestureListener sgl) {      context = activity;      detector = new GestureDetector(context, this);      listener = sgl;    }        public void onTouchEvent(MotionEvent event) {      if (this.running)        return;            boolean result = detector.onTouchEvent(event);            if (mode == MODE_SOLID)        event.setAction(MotionEvent.ACTION_CANCEL);      else if (mode == MODE_DYNAMIC) {        if (event.getAction() == ACTION_FAKE)          event.setAction(MotionEvent.ACTION_UP);        else if (result)          event.setAction(MotionEvent.ACTION_CANCEL);        else if(tapIndicator) {          event.setAction(MotionEvent.ACTION_DOWN);          tapIndicator = false;        }      }    }        public void setMode(int m) {      mode = m;    }        public int getMode() {      return mode;    }        public void setEnabled(boolean status) {      running = status;    }        public void setSwipeMaxDistance(int distance) {      swipe_max_distance = distance;    }        public void setSwipeMinDistance(int distance) {      swipe_min_distance = distance;    }        public void setSwipeMinVelocity(int distance) {      swipe_min_velocity = distance;    }        public int getSwipeMaxDistance() {      return swipe_max_distance;    }        public int getSwipeMinDistance() {      return swipe_min_distance;    }        public int getSwipeMinVelocity() {      return 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());            if (xDistance > swipe_max_distance || yDistance > swipe_max_distance)        return false;            velocityX = Math.abs(velocityX);      velocityY = Math.abs(velocityY);      boolean result = false;            if (velocityX > swipe_min_velocity && xDistance > swipe_min_distance) {        if (e1.getX() > e2.getX())          listener.onSwipe(SWIPE_LEFT);        else          listener.onSwipe(SWIPE_RIGHT);                result = true;      }            return result;    }            public boolean onSingleTap(MotionEvent e) {      tapIndicator = true;      return false;    }        @Override    public boolean onDoubleTap(MotionEvent e) {      listener.onDoubleTap();      return true;    }        @Override    public boolean onDoubleTapEvent(MotionEvent e) {      return true;    }        @Override    public boolean onSingleTapConfirmed(MotionEvent e) {      if (mode == MODE_DYNAMIC) {        e.setAction(ACTION_FAKE);        context.dispatchTouchEvent(e);      }      return false;    }        public static interface SimpleGestureListener {      void onSwipe(int direction);      void onDoubleTap();    }  }