美文网首页
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