本文转载自微信公众号《Android开发编程》,作者Android开发编程。转载本文请联系Android开发编程公众号。前言当用户触摸屏幕时,会产生很多手势,比如向下、向上、滚动、归档等;Androidsdk为我们提供了GestureDetector类,通过它我们可以识别很多手势;让我们今天学习。一、GestureDetector介绍GestureDetector这个类对外提供了两个接口和一个外部类接口:OnGestureListener,OnDoubleTapListener内部类:SimpleOnGestureListenerGestureDetector类介绍privateclassGesturelistenerimplementsGestureDetector.OnGestureListener{publicbooleanonDown(MotionEvente){//TODOAuto-generatedmethodstubreturnfalse;}publicvoidonShowPress(MotionEvente){//TODOAuto-generatedmethodstub}publicbooleanonSingleTapUp(MotionEvente){//TODOAuto-generatedmethodstubreturnfalse;}publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){//TODOAuto-generatedmethodstubreturnfalse;}publicvoidonLongPress(MotionEvente){//TODOAuto-generatedmethodstub}publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){//TODOAuto-generatedmethodstubreturnfalse;}}Thereareatotalofsixfunctionsrewrittenhere1.OnDown(MotionEvente):theuserpressesthescreenanditwillbetriggered;2.onShowPress(MotionEvente):IfitispressedIfthepressingtimeislongerthananinstant,andthepressisnotreleasedordragged,thenonShowPresswillbeexecuted.3.onLongPress(MotionEvente):Longpressthetouchscreenformorethanacertainperiodoftime,andthiseventwillbetriggered.Thetriggersequence:onDown->onShowPress->onLongPress4,onSingleTapUp(MotionEvente):单次点击操作,即点击一次屏幕立即抬起触发。当然,如果除了Down还有其他操作,那么就不再是Single操作了,所以不会触发这个事件;触发顺序:Touchup:onDown->onSingleTapUp->onSingleTapConfirmed;onFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY):滑动屏幕,用户按下Touch屏幕,快速移动后松开,由1个MotionEventACTION_DOWN,多个ACTION_MOVE,1个ACTION_UP触发;参数说明:e1:第一个ACTION_DOWNMotionEvente2:最后一个ACTION_MOVEMotionEventvelocityX:X轴移动速度,像素/秒velocityY:Y轴移动速度,像素/秒5、onScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY):在屏幕上拖动事件;无论是手动拖动视图还是抛出Action滚动都会触发多次,当ACTION_MOVE动作发生时会触发该方法;滑屏:手指触屏后,轻轻滑动后立即松开onDown-----》onScroll----》onScroll----》onScroll----》…………---->onFlingdraggingonDown------》onScroll----》onScroll------》onFiling是滑屏还是拖动只影响中间的OnScroll触发次数,onFling事件会最终被触发;2、实现GestureDetector1,实现OnGestureListener接口中的方法(可以使用匿名内部类或实现该接口的类实例);classMyGestureListenerimplementsGestureDetector.OnGesture监听器{@OverridepublicbooleanonDown(MotionEvente){returnfalse;}@OverridepublicvoidonShowPress(MotionEvente){}@OverridepublicbooleanonSingleTapUp(MotionEvente){returnfalse;}@OverridepublicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){returnfalse;}@OverridePpublicEvente(MotionEvente)OverridepublicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){returnfalse;}}2、创建GestureDetector类的实例,构造函数如下:publicGestureDetector(OnGestureListenerlistener,Handlerhandler){this(null,listenerlistener,handlertethis);}((null,listener,null);}publicGestureDetector(Contextcontext,OnGestureListenerlistener){this(context,listener,null);}publicGestureDetector(Contextcontext,OnGestureListenerlistener,Handlerhandler){}publicGestureDetector(Contextcontext,OnGestureListenerlistener,Handlerhandler,booleanunused){this(context,监听器,处理程序);}mGestureDetector=newGestureDetector(m上下文,newMyGestureListener());3、实现View.OnTouchListener接口,重写onTouch()方法4、在onTouch()方法中拦截事件处理,将控制权交给GestureDector;@OverridepublicbooleanonTouch(Viewv,MotionEventevent){returnmGestureDetector。onTouchEvent(event);}5.调用控件的View.setOnTouchListener()传入接口具体实现的引用或者调用GestureDetector.setOnDoubleTapListener()packagecom.test.test;importandroid.content.Context;importandroidif就是监听双击.util.AttributeSet;importandroid.util.Log;importandroid.view.GestureDetector;importandroid.view.MotionEvent;importandroid.view.View;/***/publicclassMyViewextendsViewimplementsView.OnTouchListener{privateContextmContext;privateGestureDetectormGestureDetector;MyubstaticfinalStringTAG="plicContextcontext){super(context););initData(context);}privatevoidinitData(Contextcontext){this.mContext=context;super.setOnTouchListener(this);super.setClickable(true);super.setLongClickable(true);super.setFocusable(true);mGestureDetector=newGestureDetector(mContext,newMyGestureListener());mGestureDetector.setOnDoubleTapListener(newMyGestureListener());}/**当视图上的事件分发到视图时,触发该方法的回调*如果该方法返回false,该事件将传递给视图中的onTouchEvent方法Activity要处理的*如果该方法返回true,表示事件已经被onTouch函数处理过,不会上传到activity中处理*该方法属于View.OnTouchListening接口*/@OverridepublicbooleanonTouch(Viewv,MotionEventevent){returnGestureDetector.onTouchEvent(event);}/**手势监听类*/classMyGestureListenerextendsGestureDetector.SimpleOnGestureListener{publicMyGestureListener(){super();}@OverridepublicbooleanonDoubleTap(MotionEvente){Log.e(TAG,"onDoubleTap");returntrue;}{@OverridepublicbooleanonDoubleTapEvente(Log.e(TAG,"onDoubleTapEvent");returntrue;}@OverridepublicbooleanonSingleTapConfirmed(MotionEvente){Log.e(TAG,"onSingleTapConfirmed");returntrue;}@OverridepublicbooleanonContextClick(MotionEvente){Log.e(TAG,"onContextClick");returntrue;}@OverridepublicbooleanonDown(MotionEvente){Log.e(TAG,"onDown");returntrue;}@OverridepublicvoidonShowPress(MotionEvente){Log.e(TAG,"onShowPress");}@OverridepublicbooleanonSingleTapUp(MotionEvente){Log.e(TAG,"onSingleTapUp");returntrue;}@OverridepublicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){Log.e(TAG,"onScroll");returntrue;}@OverridepublicvoidonLongPress(MotionEvente){Log.e(TAG,"onLongPress");}@OverridepublicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){Log.e(TAG,"onFling");returntrue;}}}自定义控件继承View,实现View.OnTouchListener监听方法,继承SimpleOnGestureListener类,重写所有方法,综上所述,本文只给出基本用法,源码待续稍后介绍。
