onTouch()与onTouchEvent()的区别
onTouch()和onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景,并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法:
onTouch() 方法
- 定义:
onTouch(View v, MotionEvent event)是View.OnTouchListener接口的方法。 - 设置监听器:需要通过
View的setOnTouchListener()方法来设置监听器。 - 调用时机:当触摸事件发生时,如果
View已经设置了OnTouchListener,则onTouch()会在onTouchEvent()之前被调用。 - 返回值:返回一个布尔值。如果返回
true,表示事件已经被处理,不再向下传递;如果返回false,则事件会继续传递给onTouchEvent()方法。 - 用途:适用于需要在特定视图上拦截或处理触摸事件的场景,例如实现自定义的触摸处理逻辑。
示例
view.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// 处理触摸事件return true; // 返回true表示事件已处理}
});
onTouchEvent() 方法
- 定义:
onTouchEvent(MotionEvent event)是View类中的方法。 - 调用时机:当
View没有设置OnTouchListener或者OnTouchListener.onTouch()返回false时,onTouchEvent()方法会被调用。 - 返回值:返回一个布尔值。默认实现返回
false,子类可以重写此方法并根据需要返回true或false。返回true表示事件已处理,不再向上传递;返回false表示事件未处理,可能会传递给父视图。 - 用途:用于处理视图自身的触摸事件。可以在自定义视图中重写此方法,以实现复杂的触摸事件处理逻辑。
示例
@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 处理按下事件return true;case MotionEvent.ACTION_MOVE:// 处理移动事件return true;case MotionEvent.ACTION_UP:// 处理抬起事件return true;default:return super.onTouchEvent(event);}
}
区别总结
-
实现方式:
onTouch()是View.OnTouchListener接口的方法,需要通过setOnTouchListener设置监听器,而onTouchEvent()是View` 类的方法,可以在自定义视图中重写。
-
调用顺序:
onTouch()在onTouchEvent()之前被调用。如果onTouch()返回true,事件不会传递给onTouchEvent();如果返回false,事件会继续传递给onTouchEvent()。
-
用途和场景:
onTouch()用于设置在某个视图上的触摸监听器,适合简单的触摸处理。onTouchEvent()用于自定义视图的内部触摸事件处理,适合复杂的触摸处理逻辑。
实际应用示例
使用 onTouchListener
假设我们有一个视图,并希望在该视图上实现简单的拖动效果:
view.setOnTouchListener(new View.OnTouchListener() {private float downX, downY;private float moveX, moveY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downX = event.getRawX();downY = event.getRawY();return true;case MotionEvent.ACTION_MOVE:moveX = event.getRawX();moveY = event.getRawY();float deltaX = moveX - downX;float deltaY = moveY - downY;v.setX(v.getX() + deltaX);v.setY(v.getY() + deltaY);downX = moveX;downY = moveY;return true;default:return false;}}
});
重写 onTouchEvent
假设我们创建一个自定义视图,实现一个简单的绘图板:
public class DrawingView extends View {private Paint paint = new Paint();private Path path = new Path();public DrawingView(Context context, AttributeSet attrs) {super(context, attrs);paint.setColor(Color.BLACK);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawPath(path, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path.moveTo(x, y);return true;case MotionEvent.ACTION_MOVE:path.lineTo(x, y);invalidate(); // 重新绘制视图return true;case MotionEvent.ACTION_UP:// 可以在此处理抬起事件return true;default:return super.onTouchEvent(event);}}
}
选择使用 onTouch() 还是 onTouchEvent()
- 如果你的需求是在特定视图上实现简单的触摸逻辑,比如拖动或点击,可以使用
onTouchListener并实现onTouch()方法。 - 如果你需要在自定义视图中处理复杂的触摸事件,例如绘图、手势识别等,可以重写
onTouchEvent()方法。
通过正确理解和使用这两个方法,可以实现丰富的触摸交互效果,提高应用的用户体验。
相关文章:
onTouch()与onTouchEvent()的区别
onTouch()和onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景,并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法: onTouch() 方法 定义:onTouch(View v, MotionEvent event)是View.OnTouchList…...
计算机网络网络层复习题2
一. 单选题(共22题,100分) 1. (单选题)如果 IPv4 数据报太大,会在传输中被分片,对分片后的数据报进行重组的是( )。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…...
[JS]面向对象ES6
class类 ES6是基于 class关键字 创建类 <script>// 1.定义类class Person {// 公有属性name// 公有属性 (设置默认值)age 18// 构造函数constructor(name) {// 构造函数的this指向实例化对象// 构造函数的作用就是给实例对象设置属性this.name name// 动态添加属性(不…...
ctfshow web sql注入 web242--web249
web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…...
发送微信消息和文件
参考:https://www.bilibili.com/video/BV1S84y1m7xd 安装: pip install PyOfficeRobotimport PyOfficeRobotPyOfficeRobot.chat.send_message(who"文件传输助手", message"你好,我是PyOfficeRobot,有什么可以帮助…...
数组-螺旋矩阵
M螺旋矩阵 ||(leetcode59) /*** param {number} n* return {number[][]}*/ var generateMatrix function(n) {const maxNum n * n;let curNum 1;const matrix new Array(n).fill(0).map(() > new Array(n).fill(0));let row 0,column 0;const d…...
GitStack详细配置与使用指南
1.引言 GitStack是一个功能强大的Git服务器管理工具,专为Windows环境设计。它提供了一个用户友好的Web界面,使得在Windows服务器上管理Git仓库变得简单高效。本文将详细介绍GitStack的安装、配置和使用方法,帮助您快速搭建自己的Git服务器。 2.GitStack安装 2.1 系统要求 Wi…...
LoadRunner-Virtual User Generator组件学习
重点知识 LR工具是拿C写的,所以它的脚本默认也是C,但是最终生成的脚本不止是C,它是支持C和Java语言的,这个大家要清楚,对本身懂代码的就很友好,你了解java,那就可以把脚本改成java,…...
NAT地址转换实验,实验超简单
实验拓扑 实验目的 将内网区域(灰色区域)的地址转换为172.16.1.0 实验过程 配置静态NAT(基于接口的静态NAT) R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…...
pip常用命令详解
pip 是 Python 的官方第三方包管理工具之一,其为 Python 包的安装与管理提供了极大的便利。本文将详细介绍 pip 的常见命令及其用法,帮助读者更好地利用这一强大的工具。 1. 安装 pip 在开始使用 pip 之前,确保您的系统中已经安装了 pip。p…...
vue3从入门到精通
CDN方式使用vue: 获取复杂数据类型: 使用结构复制语法去除vue前缀: 使用模块化开发: 需要安装插件live server: 需要访问网络地址: 简单数据类型ref的使用: 如何修改number reactive修改值不需要.value&…...
kubuadm 方式部署 k8s 集群
准备三台机器 主机名IP地址CPU/内存操作系统版本角色K8S版本Docker版本k8s231192.168.99.2312C4GCentos 7master1.23.1720.10.24k8s232192.168.99.2322C4GCentos 7woker1.23.1720.10.24k8s233192.168.99.2332C4GCentos 7woker1.23.1720.10.24 需要在K8S集群各节点上面安装dock…...
Android studio 打包低版本的Android项目报错
一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…...
【教程】lighttpd配置端口反向代理
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、修改配置文件: sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy: 3、然后添加端口映射: 4、保存&…...
微服务之服务保护策略【持续更新】
文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离(Hystix隔离),每个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU…...
微信小程序的开发
前端:微信小程序开发的技术 后端:springboot的框架 一:微信小程序环境的搭建 1. 访问微信开发者官⽅⽹站的⼩程序开发⼯具下载⻚⾯。 2. 根据你的操作系统(Windows、macOS或Linux)选择合适的版本进⾏下载。 3. 下…...
Oracle中CREATE FORCE VIEW的说明和例子
Oracle数据库中的CREATE FORCE VIEW语句用于创建视图,即使在视图所依赖的基表或对象不存在,或者创建视图的用户对这些对象没有足够的权限时,也能强制创建视图。不过,需要明确的是,尽管视图能被强制创建,但在…...
C#反射基本应用
1、反射 反射是.NET Framework的一个特性,它允许在运行时获取类型的信息以及动态创建对象,调用方法,以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…...
1.英语中的从句学习
名词性从句: 1.最常见的连接词是that在宾语从句中的运用,如:I know that you will come. 句中的that 就是连接词,作用就是连接主句和从句,不充当成分也没有含义,只起风向标的作用,告诉你接下来…...
Perl语言简介
Perl语言,全称为Practical Extraction and Report Language(实用提取与报告语言),是一种高级、通用、解释型的编程语言。它由Larry Wall于1987年首次发布,并迅速因其强大的文本处理能力和高度的灵活性而受到广泛应用。…...
Unity安卓打包实战指南:从环境配置到APK生成全链路排错
1. 这不是“入门教程”,而是一份写给真实开发现场的生存指南你打开Unity,新建一个3D项目,拖进一个Cube,点击Play——它动了。你松了口气,觉得“Unity好像也没那么难”。但当你把APK打包发给测试同事,对方回…...
IPD的势、道、法、术、器
目录 简介 一、势:为什么 IPD 是必然选择? 二、道:IPD 的底层哲学 三、法与术:从战略到执行的具体路径 四、器:让流程真正落地的工具与组织 不是每家公司都需要全套 IPD,但每家公司都需要 IPD 思维 简…...
13456
12356...
基于声卡与电流互感器的安全交流功率测量系统设计与实践
1. 项目概述:用声卡安全测量交流功率我一直对各种测量技术抱有浓厚的兴趣,毕竟“测量即认知”这句老话在今天依然适用。对于电力消耗和产出,没有什么比直接测量更能说明问题了。交流功率的测量,核心在于同时获取电压和电流的瞬时值…...
Unlock-Music:浏览器中一键解锁加密音乐文件的完整指南
Unlock-Music:浏览器中一键解锁加密音乐文件的完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: http…...
机器学习的最佳实践:这7个原则让你的模型更稳定
对于软件测试从业者而言,机器学习技术正在快速融入测试流程:从自动化测试用例生成、缺陷预测到测试环境异常检测,机器学习模型的稳定性直接决定了测试结果的可靠性——如果模型在测试环境波动、输入数据变化时性能骤降,不仅无法提…...
ZYNQ中断避坑指南:PL端信号线如何正确‘连线’到PS端处理函数?
ZYNQ中断系统深度解析:从硬件信号到软件响应的全链路实践 在嵌入式系统开发中,中断处理是实时响应的核心机制。对于ZYNQ这种集成了ARM处理器(PS)和可编程逻辑(PL)的异构计算平台,其中断系统既有传统处理器的特性,又具备FPGA灵活定…...
3分钟快速解决Windows热键冲突检测难题:Hotkey Detective终极指南
3分钟快速解决Windows热键冲突检测难题:Hotkey Detective终极指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...
《关于 AI Agent 基础设施的一些奇思妙想》
目录 目录 目录 一、AI Agent 容器 问题背景 想法思路:API 中转站模式 多 Agent 切换 二、手机端操控 AI Agent(手机与电脑互联) 三、AI 开发依赖管理工具 总结 最近 AI Agent 越来越火,我作为一个重度使用者,…...
四大桌面云品牌评测:从安全、体验到性价比
桌面云不再是大型企业的专属,它已成为各行各业实现数据安全、混合办公和IT降本增效的“标准配置”。经过对市场主流方案的全面评估,我们认为,深信服(Sangfor)aDesk桌面云因其在安全内生化、传输协议自研化、运维管理智…...
