美文网首页
GestureDetector与ScaleGestureDete

GestureDetector与ScaleGestureDete

作者: 雯艺雪 | 来源:发表于2019-04-18 09:21 被阅读0次

    一、GestureDetector

    • 概述
      主要用于识别一些特定的手势,调用GestureDetector.onTouchEvent()把MotionEvent传递进去即可。对于工作手势回调,可通过GestureDetector中的接口OnGestureDetectorListener来完成。
      只需在View.onTouchEvent()中调用GestureDetector的OnTouchEvent()即可

    二、GestureDetector常用接口

    • OnGestureListener:手势事件监听
    1、boolean onDown

    GestureDetector的OnTouchEvent()中发生action_down事件时触发。隔一定时间后触发onShowPress()和onLongPress()

    2、void onShowPress()

    在down事件发生时并不会立即执行,而是会等待一段时间后执行,如果期间发生了action_move,action_up或者ACTION_CANCEL,就会取消执行该方法。
    只有在事件是press——按下足够长的时间并且没有大范围移动时才会执行,用于提示用户已经按下,有可能会发展成onLongPress。

    3、onLongPress

    当press时间过长时就会由onShowPress转化成onLongPress

    4、boolean onSingleTapUp

    轻触(手指松开)
    GestureDetector的OnTouchEvent()中只有在action_up时才会有可能执行该方法。但它并不等价于action_up事件。

    5、boolean onScroll

    滑动(一次完整事件可能会多次触发该函数)返回值表示事件是否处理。

    6、void onLongPress

    长按(手指尚未松开也没有达到scroll条件)

    7、boolean onFling

    滑屏(当用户按下触摸屏、快速滑动后松开,返回值表示事件是否处理)

    • onDoubleTapListener:双击事件监听
        private GestureDetector.OnDoubleTapListener onDoubleTapListener=new GestureDetector.OnDoubleTapListener() {
            /**
             * 单击事件
             */
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                return false;
            }
    
            /**
             * 双击事件(与onSingleTapConfirmed互斥)
             */
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                return false;
            }
    
            /**
             * 双击事件产生之后手指还没有抬起时的后续事件(action_up,action_down,action_move)
             */
            @Override
            public boolean onDoubleTapEvent(MotionEvent e) {
                return false;
            }
        };
    
    • OnContextClickListener:外接设备产生的事件
    • SimpleOnGestureListener:以上三个接口中所有函数的集成,包含三个接口所有必须实现的函数并且经过重写,但所有方法体都是空的。需要根据情况去重写。

    总结:处理事件时,根据需要展示效果
    单击:onSingleTapUp;
    长按:onLongPress;
    按下:onShowPress();
    拖动:onScroll
    快速滑动:onFling
    双击:onDoubleTap

    • 具体使用
      在onTouchEvent方法内调用GestureDetector的onTouchEvent,传递事件即可。

    三、ScaleGestureDetector

    用于处理缩放的工具类,用法与GestureDetector类似,都是通过onTouchEvent关联相应的MotionEvent
    ScaleGestureDetector示例

    class MyScaleGestureDetector extends ScaleGestureDetector{
    
            public MyScaleGestureDetector(Context context, OnScaleGestureListener listener) {
                super(context, listener);
            }
    
            /**
             * 缩放是否正在进行中
             */
            @Override
            public boolean isInProgress() {
                return super.isInProgress();
            }
    
            /**
             * 返回组成缩放手势(两个手指)中点x的位置
             */
            @Override
            public float getFocusX() {
                return super.getFocusX();
            }
    
            /**
             * 返回组成缩放手势(两个手指)中点y的位置
             */
            @Override
            public float getFocusY() {
                return super.getFocusY();
            }
    
            /**
             * 返回组成缩放手势的两个触点的跨度(两个触点间的距离)
             */
            @Override
            public float getCurrentSpan() {
                return super.getCurrentSpan();
            }
    
            /**
             * 返回组成缩放手势的两个触点的跨度(两个触点间的距离)x的位置
             */
            @Override
            public float getCurrentSpanX() {
                return super.getCurrentSpanX();
            }
    
            /**
             * 返回组成缩放手势的两个触点的跨度(两个触点间的距离)y的位置
             */
            @Override
            public float getCurrentSpanY() {
                return super.getCurrentSpanY();
            }
    
            /**
             * 返回组成缩放手势的两个触点的前一次缩放的跨度(两个触点间的距离)
             */
            @Override
            public float getPreviousSpan() {
                return super.getPreviousSpan();
            }
    
            /**
             * 返回组成缩放手势的两个触点的前一次缩放的跨度(两个触点间的距离)x的距离
             */
            @Override
            public float getPreviousSpanX() {
                return super.getPreviousSpanX();
            }
    
            /**
             * 返回组成缩放手势的两个触点的前一次缩放的跨度(两个触点间的距离)y的距离
             */
            @Override
            public float getPreviousSpanY() {
                return super.getPreviousSpanY();
            }
    
            /**
             * 获取本次缩放事件的缩放因子,缩放事件以onScale()返回值为基准,一旦该方法返回true,代表本次事件结束,重新开启下次缩放事件
             */
            @Override
            public float getScaleFactor() {
                return super.getScaleFactor();
            }
    
            /**
             * 返回上次缩放事件结束时到当前时间的间隔
             */
            @Override
            public long getTimeDelta() {
                return super.getTimeDelta();
            }
    
            /**
             * 获取当前motion事件的时间
             */
            @Override
            public long getEventTime() {
                return super.getEventTime();
            }
        }
    
    • OnScaleGestureListener接口
      示例
    private ScaleGestureDetector.OnScaleGestureListener scaleGestureListener=new ScaleGestureDetector.OnScaleGestureListener() {
            /*
            * 正在缩放,返回值表示下次缩放是否需要重置,如果返回true,detector就会重置缩放事件,如果返回false,detector会在之前的缩放上继续进行计算
            */
            @Override
            public boolean onScale(ScaleGestureDetector detector) {
                return false;
            }
    
        /**
         * 缩放开始,返回值表示是否受理后续的缩放事件
         */
        @Override
            public boolean onScaleBegin(ScaleGestureDetector detector) {
                return false;
            }
    
        /**
         * 缩放结束
         */
        @Override
            public void onScaleEnd(ScaleGestureDetector detector) {
    
            }
    
        };
    

    相关文章

      网友评论

          本文标题:GestureDetector与ScaleGestureDete

          本文链接:https://www.haomeiwen.com/subject/bmcnwqtx.html