详谈OnTouchListener与OnGestureListener的区别

作者:jingxian 时间:2023-11-13 14:21:24 

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();
}
}
标签:OnTouchListener,OnGestureListener
0
投稿

猜你喜欢

  • 浅谈Unity脚本生命周期与执行顺序

    2022-05-22 00:47:34
  • Android App开发中使用RecyclerView替代ListView的实践

    2021-06-14 06:53:36
  • 分享几个Java工作中实用的代码优化技巧

    2023-11-28 12:04:50
  • C#实现文字转语音功能

    2022-06-18 13:07:59
  • struts2如何使用拦截器进行用户权限控制实例

    2023-02-23 18:14:15
  • MyBatis if test 判断字符串相等不生效问题

    2021-10-11 22:42:01
  • Java String不可变性实现原理解析

    2023-11-09 23:15:53
  • Java实现简单的万年历

    2023-11-29 08:31:24
  • Android中隐藏标题栏和状态栏的方法

    2022-04-16 07:04:27
  • Mybatis中连接查询和嵌套查询实例代码

    2021-08-23 13:24:31
  • 基于Android引入IjkPlayer无法播放mkv格式视频的解决方法

    2023-02-24 22:32:35
  • MyBatis中${} 和 #{} 有什么区别小结

    2021-09-21 14:42:35
  • C#实现DataTable映射成Model的方法(附源码)

    2023-03-12 06:10:56
  • Android Notification 使用方法详解

    2021-07-14 14:42:01
  • C# DateTime日期比较方法案例详解

    2021-11-09 15:32:47
  • SpringBoot之导入静态资源详解

    2021-06-22 05:01:30
  • FragmentStatePagerAdapter保存恢复下拉刷新Fragment内存数据

    2023-07-17 20:36:40
  • springboot 跨域配置类及跨域请求配置

    2023-01-31 14:27:19
  • android图像绘制(一)多种方法做图像镜像

    2023-08-23 01:34:18
  • Java中常见死锁与活锁的实例详解

    2023-06-26 13:17:00
  • asp之家 软件编程 m.aspxhome.com