GestureDetector类及其用法
Android sdk 给我们提供了GestureDetector(Gesture:手势,Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。

GestureDetector这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener。


GestureDetector.OnDoubleTapListener接口:用来通知DoubleTap事件,类似于鼠标的双击事件,该接口有如下三个回调函数:
        1. onDoubleTap(MotionEvent e):在双击的第二下按下时触发 。
        2. onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);双击的第二下按下和抬起时都会触发,可用e.getAction()区分。 

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

 

GestureDetector.OnGestureListener接口:用来通知普通的手势事件,该接口有如下六个回调函数:
     1.   onDown(MotionEvent e):按下事件;
     2.   onSingleTapUp(MotionEvent e):单击时,在按下后既没有滑动(onScroll),又没有长按(onLongPress),然后抬起时触发。
          点击一下非常快的(不滑动)Touchup:onDown->onSingleTapUp->onSingleTapConfirmed 
          点击一下稍微慢点的(不滑动)Touchup:onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

     3.   onShowPress(MotionEvent e):down事件发生而move或up还没发生前,触发该事件;Touch了但还没有滑动时触发。

      与onDown,onLongPress比较:onDown只要按下一定立刻触发。而按下后过一会没有滑动先触发onShowPress再是onLongPress。如,按下后一直不滑动,触发顺序onDown-->onShowPress-->onLongPress。 

     4.   onLongPress(MotionEvent e):长按事件;Touch了不移动一直Touch down时触发。 
     5.   onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件;Touch了滑动一点距离后,在抬起时才会触发。      

     参数: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):在屏幕上拖动事件。在ACTION_MOVE动作发生时触发,会多次触发。onDown-->onScroll-->onScroll-->onFiling
 
SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,这个类实现了上述两个接口(但是所有的方法体都是空的),该类是static class,也就是说它实际上是一个外部类。可以在外部继承这个类,重写里面的手势处理方法。
 

    方法步骤:


    第一种:

    1,通过GestureDetector的构造方法将SimpleOnGestureListener对象传递进去,这样GestureDetector能处理不同的手势了。

    public GestureDetector(Context context, GestureDetector.OnGestureListener listener)

    2,在OnTouchListener的onTouch方法中

    private OnTouchListener gestureTouchListener = new OnTouchListener()     {        public boolean onTouch(View v, MotionEvent event)         {             return gDetector.onTouchEvent(event);        }    };

      第二种:

    private GestureDetector mGestureDetector;    mGestureListener = new BookOnGestureListener();    mGestureDetector = new GestureDetector(mGestureListener);    class BookOnGestureListener implements OnGestureListener     {        public boolean onTouchEvent(MotionEvent event)         {             mGestureListener.onTouchEvent(event);        }    }

第三种:

private GestureDetector mGestureDetector;@Overridepublic void onCreate(Bundle savedInstanceState){    super.onCreate(savedInstanceState);    mGestureDetector = new GestureDetector(this, new LearnGestureListener());}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (mGestureDetector.onTouchEvent(event))      return true;    else        return false;}private class LearnGestureListener extends GestureDetector.SimpleOnGestureListener{    @Override    public boolean onSingleTapUp(MotionEvent ev)     {        Log.d("onSingleTapUp",ev.toString());        return true;    }    @Override    public void onShowPress(MotionEvent ev)     {        Log.d("onShowPress",ev.toString());    }    @Override    public void onLongPress(MotionEvent ev)     {        Log.d("onLongPress",ev.toString());    }    @Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)     {        Log.d("onScroll",e1.toString());        return true;    }    @Override    public boolean onDown(MotionEvent ev)     {        Log.d("onDownd",ev.toString());        return true;    }    @Override    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)     {        Log.d("d",e1.toString());        Log.d("e2",e2.toString());        return true;    }}

    1,在当前类中创建一个GestureDetector实例。

     private GestureDetector mGestureDetector;

    2,创建一个Listener来实时监听当前面板操作手势。

    private class LearnGestureListener extends GestureDetector.SimpleOnGestureListener                                                             

    3,在初始化时,将Listener实例关联当前的GestureDetector实例。 

    mGestureDetector = new GestureDetector(this, new LearnGestureListener());

    4,利用onTouchEvent方法作为入口检测,通过传递MotionEvent参数来监听操作手势。

    mGestureDetector.onTouchEvent(event)


    第四种:

private GestureDetector mGestureDetector;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGestureDetector = new GestureDetector(this, new MyGestureListener());}@Overridepublic boolean onTouchEvent(MotionEvent event) {return mGestureDetector.onTouchEvent(event); }private class MyGestureListener extends GestureDetector.SimpleOnGestureListener{@Overridepublic boolean onSingleTapUp(MotionEvent ev) {Log.d("onSingleTapUp",ev.toString());return true;}@Overridepublic void onShowPress(MotionEvent ev) {Log.d("onShowPress",ev.toString());}@Overridepublic void onLongPress(MotionEvent ev){Log.d("onLongPress",ev.toString());}…}

    基本的内容就是创建一个GestureDetector的对象,传入listener对象,在自己接收到的onTouchEvent中将event传给GestureDetector进行分析,listener会回调给我们相应的动作。其中GestureDetector.SimpleOnGestureListener(Framework帮我们简化了)是实现了上面提到的OnGestureListener和OnDoubleTapListener两个接口的类,我们只需要继承它并重写其中我们关心的回调即可。

    最后,再提一下双击和三击的识别过程:在第一次单击down时,给Hanlder发送了一个延时300ms的消息,如果300ms里,发生了第二次单击的down事件,那么,就认为是双击事件了,并移除之前发送的延时消息。如果300ms后仍没有第二次的down消息,那么就判定为SingleTapConfirmed事件(单击事件)。三击的判定和双击的判定类似,只是多了一次发送延时消息的过程。

   
   
   
   
   
   


更多相关文章

  1. Android(安卓)中文 API (25) ―― ZoomControls
  2. android listviewListview中的button点击事件或者是onitemclick
  3. Android中丰富多彩的onTouch事件
  4. 丰富多彩的Android(安卓)onTouch事件
  5. 丰富多彩的Android(安卓)onTouch事件
  6. 丰富多彩的Android(安卓)onTouch事件
  7. android多点触摸缩放图片
  8. Android实现图片放大缩小
  9. andriod item内checked的setOnClickListener事件和setOnItemClic

随机推荐

  1. Webview里JS跳转到Activity页面
  2. Android使用ValueAnimator开发仿余额宝数
  3. Android(安卓)沉浸式状态栏 SystemStatus
  4. Android(安卓)Update Engine分析(五)服务端
  5. Android(安卓)Fragment与Fragment之间数
  6. 今日头条屏幕适配_工具类
  7. Animation介绍
  8. android gradle 4.1以上依赖的改变:compil
  9. TypedArray和attrs.xml
  10. Android(安卓)DataBinding+ViewModel+Liv