详谈OnTouchListener与OnGestureListener的区别
Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,是通过OnTouchListener实现的;而手势是通过OnGestureListener实现的,那么这两者有什么关联呢?
OnTouchListener
OnTouchListener接口中包含一个onTouch()方法,直接看一个例子:
publicclassMainActivityextendsActivityimplementsOnTouchListener{ publicvoidonCreate(BundleoutState){ super.onCreate(outState); setContentView(R.layout.main); TextViewtv=(TextView)findViewById(R.id.tv); tv.setOnTouchListener(this); } publicbooleanonTouch(Viewv,MotionEventevent){ Toast.makeText(this,"TouchTouch",Toast.LENGTH_SHORT).show(); returnfalse; } }
我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括ACTION_DOWN(按下触摸屏),ACTION_MOVE(按下触摸屏后移动受力点),ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。
可以看到OnTouchListener只能监听到三种触摸事件,即按下,移动,松开,如果想要监听到双击、滑动、长按等复杂的手势操作,这个时候就必须得用到OnGestureListener了。
OnGestureListener
接着上面的例子,这次加入手势监听:
publicclassMainActivityextendsActivityimplementsOnTouchListener,OnGestureListener{ privateGestureDetectormGestureDetector; publicvoidonCreate(BundleoutState){ super.onCreate(outState); setContentView(R.layout.main); mGestureDetector=newGestureDetector(this); TextViewtv=(TextView)findViewById(R.id.tv); tv.setOnTouchListener(this); } publicbooleanonTouch(Viewv,MotionEventevent){ returnmGestureDetector.onTouchEvent(event); } //用户轻触触摸屏,由1个MotionEventACTION_DOWN触发 publicbooleanonDown(MotionEventarg0){ Log.i("MyGesture","onDown"); Toast.makeText(this,"onDown",Toast.LENGTH_SHORT).show(); returntrue; } //用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEventACTION_DOWN触发,注意和onDown()的区别,强调的是没有松开或者拖动的状态 publicvoidonShowPress(MotionEvente){ Log.i("MyGesture","onShowPress"); Toast.makeText(this,"onShowPress",Toast.LENGTH_SHORT).show(); } //用户(轻触触摸屏后)松开,由一个1个MotionEventACTION_UP触发 publicbooleanonSingleTapUp(MotionEvente){ Log.i("MyGesture","onSingleTapUp"); Toast.makeText(this,"onSingleTapUp",Toast.LENGTH_SHORT).show(); returntrue; } //用户按下触摸屏、快速移动后松开,由1个MotionEventACTION_DOWN,多个ACTION_MOVE,1个ACTION_UP触发 publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){ Log.i("MyGesture","onFling"); Toast.makeText(this,"onFling",Toast.LENGTH_LONG).show(); returntrue; } //用户按下触摸屏,并拖动,由1个MotionEventACTION_DOWN,多个ACTION_MOVE触发 publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){ Log.i("MyGesture","onScroll"); Toast.makeText(this,"onScroll",Toast.LENGTH_LONG).show(); returntrue; } //用户长按触摸屏,由多个MotionEventACTION_DOWN触发 publicvoidonLongPress(MotionEvente){ Log.i("MyGesture","onLongPress"); Toast.makeText(this,"onLongPress",Toast.LENGTH_LONG).show(); } }
以上这篇详谈OnTouchListener与OnGestureListener的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。