当前位置: 代码迷 >> Android >> Android wiki:12.GestureDetector银屏手势
  详细解决方案

Android wiki:12.GestureDetector银屏手势

热度:247   发布时间:2016-04-28 00:11:19.0
Android wiki:12.GestureDetector屏幕手势
GestureDetector类:手势探测器。
1,onDoubleTap(MotionEvent e):在双击的第二下,Touch down时触发 。

2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,
    包含down、up和move事件(这里指的是在双击之间发生的事件,
    例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);
    双击的第二下Touch down和up都会触发,可用e.getAction()区分。

3,onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,
    如果连续点击两次就是DoubleTap手势,
    如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,
    然后触发SingleTapConfirmed事件。这个方法不同于onSingleTapUp,他是在GestureDetector确信用户在第一次触摸屏幕后,
    没有紧跟着第二次触摸屏幕,也就是不是“双击”的时候触发   


GestureDetector.OnGestureListener接口:用来通知普通的手势事件,该接口有如下六个回调函数:
1.   onDown(MotionEvent e):down事件;
2.   onSingleTapUp(MotionEvent e):一次点击up事件;在touch down后又没有滑动

(onScroll),又没有长按(onLongPress),然后Touchup时触发。


点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed


点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed


3.   onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件;
        Touch了还没有滑动时触发(与onDown,onLongPress)比较onDown只要Touch down一定立刻触发。
        而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
        所以Touchdown后一直不滑动按照onDown->onShowPress->onLongPress这个顺序触发。


4.   onLongPress(MotionEvent e):长按事件;Touch了不移动一直Touch down时触发
    
    
5.   onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手
    势事件;Touch了滑动一点距离后,在ACTION_UP时才会触发       
    参数:e1 第1个ACTION_DOWN MotionEvent 并且只有一个;e2 最后一个ACTION_MOVE MotionEvent ;
    velocityX X轴上的移动速度,像素/秒 ;velocityY Y轴上的移动速度,像素/秒.
    触发条件:X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒

6.   onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上
     拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发



//-------------例子-手指右左滑动切换界面------------------------------------
public abstract class BaseSetupActivity extends Activity {

    private static final String TAG = "BaseSetupActivity";
    // 1.定义一个手势识别器
    private GestureDetector gd;// 手势探测器
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //2.实例化这个手势识别器
        gd = new GestureDetector(this, new SimpleOnGestureListener() {
        
            // 快速滑动屏幕 velocityX:x轴的加速度 e1:按下去的第一个点 e2:最后一个点
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

                if ((e2.getRawX() - e1.getRawX()) > 20) {
                    // 说明手指滑动的方向是 -------> 进行上一页操作
                    Log.i(TAG, "说明手指滑动的方向是    -------> 进行上一页操作");
                    
                    //..................
                    
                    return true;
                }

                if ((e1.getRawX() - e2.getRawX()) > 20) {
                    // 说明手指滑动的方向是 <------- 进行下一页操作
                    Log.i(TAG, "说明手指滑动的方向是 <------- 进行下一页操作");
                    
                    //..................
                    
                    return true;
                }

                // 禁止上滑操作
                if (Math.abs(e1.getRawY() - e2.getRawY()) > 200) {
                    Log.i(TAG, "这是上下滑的操作");
                    return true;
                }
                
                //屏蔽在X滑动很慢的情形        
                if(Math.abs(velocityX)<200){
                    Log.i(TAG, "滑动得太慢了");
                    return true;
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
            //  拖动屏幕
            public void onScroll(MotionEvent e) {
                super.onLongPress(e);
            }

            // 长按屏幕
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);
            }

            // 双击屏幕
            public boolean onDoubleTapEvent(MotionEvent e) {
                return super.onDoubleTapEvent(e);
            }

            // 单击屏幕
            public boolean onSingleTapConfirmed(MotionEvent e) {
                return super.onSingleTapConfirmed(e);
            }

        });
    }
    
    
    
    /**
     //3: activity接收到页面传回来的点击事件,然后传给GestureDetector处理
     */
    public boolean onTouchEvent(MotionEvent event) {
        gd.onTouchEvent(event);
        return super.onTouchEvent(event);
    }

    

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案