详谈OnTouchListener与OnGestureListener的区别

发布时间 - 2026-01-11 00:36:17    点击率:

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的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# OnTouchListener  # OnGestureListener  # 拖动  # 按下  # 多个  # 轻触  # 给大家  # 方法来  # 的是  # 有什么  # 我们可以  # 希望能  # 可以看到  # 三种  # 这个时候  # 双击  # 可以实现  # 这篇  # 等功能  # 小编  # 大家多多  # 这两者 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  免费网站制作appp,免费制作app哪个平台好?  如何快速搭建虚拟主机网站?新手必看指南  Laravel Fortify是什么,和Jetstream有什么关系  iOS UIView常见属性方法小结  Swift中循环语句中的转移语句 break 和 continue  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  iOS发送验证码倒计时应用  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  b2c电商网站制作流程,b2c水平综合的电商平台?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何登录建站主机?访问步骤全解析  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  ,网页ppt怎么弄成自己的ppt?  怎么用AI帮你为初创公司进行市场定位分析?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何构建满足综合性能需求的优质建站方案?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何快速选择适合个人网站的云服务器配置?  如何获取上海专业网站定制建站电话?  如何用y主机助手快速搭建网站?  百度浏览器如何管理插件 百度浏览器插件管理方法  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  使用Dockerfile构建java web环境  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  JavaScript Ajax实现异步通信  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  简单实现Android文件上传  Swift中swift中的switch 语句  如何在橙子建站上传落地页?操作指南详解  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  C语言设计一个闪闪的圣诞树  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  JS经典正则表达式笔试题汇总  如何快速搭建个人网站并优化SEO?  如何用已有域名快速搭建网站?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Python图片处理进阶教程_Pillow滤镜与图像增强  详解Android——蓝牙技术 带你实现终端间数据传输  EditPlus中的正则表达式 实战(4)