Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,是通过OnTouchListener实现的;而手势是通过OnGestureListener实现的,那么这两者有什么关联呢?

OnTouchListener

OnTouchListener接口中包含一个onTouch()方法,直接看一个例子:

public class MainActivity extends Activity implements OnTouchListener {public void onCreate(Bundle outState) {    super.onCreate(outState);    setContentView(R.layout.main);    TextView tv = (TextView) findViewById(R.id.tv);    tv.setOnTouchListener(this);    }    public boolean onTouch(View v, MotionEvent event) {    Toast.makeText(this,  "Touch Touch", Toast.LENGTH_SHORT).show();return false ;     }}

我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、 getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。

可以看到OnTouchListener只能监听到三种触摸事件,即按下,移动,松开,如果想要监听到双击、滑动、长按等复杂的手势操作,这个时候就必须得用到OnGestureListener了。

OnGestureListener

接着上面的例子,这次加入手势监听:

public class MainActivity extends Activity implements OnTouchListener, OnGestureListener {private  GestureDetector mGestureDetector; public void onCreate(Bundle outState) {    super.onCreate(outState);    setContentView(R.layout.main);    mGestureDetector = new GestureDetector(this);    TextView tv = (TextView) findViewById(R.id.tv);    tv.setOnTouchListener(this);    }    public boolean onTouch(View v, MotionEvent event) {    return mGestureDetector.onTouchEvent(event);    }    // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发      public boolean onDown(MotionEvent arg0) {Log.i("MyGesture", "onDown");Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();      return true;}// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发, 注意和onDown()的区别,强调的是没有松开或者拖动的状态public void onShowPress(MotionEvent e) {Log.i("MyGesture",  "onShowPress");           Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();}// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发public   boolean  onSingleTapUp(MotionEvent e) {Log.i("MyGesture", "onSingleTapUp");Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();return true;}// 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {    Log.i("MyGesture", "onFling");Toast.makeText(this, "onFling", Toast.LENGTH_LONG).show();     return true;}  // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {            Log.i("MyGesture", "onScroll"); Toast.makeText(this, "onScroll", Toast.LENGTH_LONG).show();return true; }  // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发public   void  onLongPress(MotionEvent e) {Log.i("MyGesture", "onLongPress");Toast.makeText(this, "onLongPress", Toast.LENGTH_LONG).show(); }}


更多相关文章

  1. Android(安卓)activity onNewIntent触发时机
  2. android实现打电话和发短信的功能(10学员张晓丛)
  3. Android(安卓)onTouch、OnLongClick、onClick及ScrollView滑动事
  4. 设备的search按钮调用自己程序的search模块
  5. Android(安卓)Camera内存问题剖析
  6. Android开发--事件的处理/按键按下,弹起,触摸事件等
  7. Android系统下如何通过外设实现GPIO中断触发调用Android程序执行
  8. android surfaceview实现简易抓球游戏
  9. Android(安卓)触屏事件 (单击,双击,滑动)

随机推荐

  1. 好用的Python编辑器有哪些?五大工具!
  2. Linux常见的开发命令有哪些?分类介绍!
  3. prometheus监控系统
  4. 培训web前端开发无法胜任工作怎么办?
  5. 思迈特软件的企业级商业智能应用案例
  6. 用 WebRTC 打造一个音乐教育 App,要解决哪
  7. 使用case语句编写一个系统服务脚本
  8. MySQL数据库入门——备份数据库
  9. Mac电脑设置语音详细度的方法
  10. Linux基础-21day-Linux系统LVM逻辑卷管理