当前位置: 首页 > news >正文

onTouch()与onTouchEvent()的区别

onTouch()onTouchEvent()是Android中处理触摸事件的两个重要方法。它们用于不同的场景,并在事件分发机制中扮演不同的角色。以下是它们的详细区别和使用方法:

onTouch() 方法

  • 定义onTouch(View v, MotionEvent event)View.OnTouchListener接口的方法。
  • 设置监听器:需要通过ViewsetOnTouchListener()方法来设置监听器。
  • 调用时机:当触摸事件发生时,如果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,子类可以重写此方法并根据需要返回truefalse。返回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);}
}

区别总结

  1. 实现方式

    • onTouch()View.OnTouchListener 接口的方法,需要通过 setOnTouchListener设置监听器,而 onTouchEvent()View` 类的方法,可以在自定义视图中重写。
  2. 调用顺序

    • onTouch()onTouchEvent() 之前被调用。如果 onTouch() 返回 true,事件不会传递给 onTouchEvent();如果返回 false,事件会继续传递给 onTouchEvent()
  3. 用途和场景

    • 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…...

发送微信消息和文件

参考&#xff1a;https://www.bilibili.com/video/BV1S84y1m7xd 安装&#xff1a; pip install PyOfficeRobotimport PyOfficeRobotPyOfficeRobot.chat.send_message(who"文件传输助手", message"你好&#xff0c;我是PyOfficeRobot&#xff0c;有什么可以帮助…...

数组-螺旋矩阵

M螺旋矩阵 ||&#xff08;leetcode59&#xff09; /*** 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写的&#xff0c;所以它的脚本默认也是C&#xff0c;但是最终生成的脚本不止是C&#xff0c;它是支持C和Java语言的&#xff0c;这个大家要清楚&#xff0c;对本身懂代码的就很友好&#xff0c;你了解java&#xff0c;那就可以把脚本改成java&#xff0c;…...

NAT地址转换实验,实验超简单

实验拓扑 实验目的 将内网区域&#xff08;灰色区域&#xff09;的地址转换为172.16.1.0 实验过程 配置静态NAT&#xff08;基于接口的静态NAT&#xff09; R1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1]un in en I…...

pip常用命令详解

pip 是 Python 的官方第三方包管理工具之一&#xff0c;其为 Python 包的安装与管理提供了极大的便利。本文将详细介绍 pip 的常见命令及其用法&#xff0c;帮助读者更好地利用这一强大的工具。 1. 安装 pip 在开始使用 pip 之前&#xff0c;确保您的系统中已经安装了 pip。p…...

vue3从入门到精通

CDN方式使用vue: 获取复杂数据类型&#xff1a; 使用结构复制语法去除vue前缀&#xff1a; 使用模块化开发&#xff1a; 需要安装插件live server&#xff1a; 需要访问网络地址&#xff1a; 简单数据类型ref的使用&#xff1a; 如何修改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配置端口反向代理

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、修改配置文件&#xff1a; sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy&#xff1a; 3、然后添加端口映射&#xff1a; 4、保存&…...

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离&#xff08;Hystix隔离&#xff09;&#xff0c;每个被隔离的业务都要创建一个独立的线程池&#xff0c;线程过多会带来额外的CPU…...

微信小程序的开发

前端&#xff1a;微信小程序开发的技术 后端&#xff1a;springboot的框架 一&#xff1a;微信小程序环境的搭建 1. 访问微信开发者官⽅⽹站的⼩程序开发⼯具下载⻚⾯。 2. 根据你的操作系统&#xff08;Windows、macOS或Linux&#xff09;选择合适的版本进⾏下载。 3. 下…...

Oracle中CREATE FORCE VIEW的说明和例子

Oracle数据库中的CREATE FORCE VIEW语句用于创建视图&#xff0c;即使在视图所依赖的基表或对象不存在&#xff0c;或者创建视图的用户对这些对象没有足够的权限时&#xff0c;也能强制创建视图。不过&#xff0c;需要明确的是&#xff0c;尽管视图能被强制创建&#xff0c;但在…...

C#反射基本应用

1、反射 反射是.NET Framework的一个特性&#xff0c;它允许在运行时获取类型的信息以及动态创建对象&#xff0c;调用方法&#xff0c;以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…...

1.英语中的从句学习

名词性从句&#xff1a; 1.最常见的连接词是that在宾语从句中的运用&#xff0c;如&#xff1a;I know that you will come. 句中的that 就是连接词&#xff0c;作用就是连接主句和从句&#xff0c;不充当成分也没有含义&#xff0c;只起风向标的作用&#xff0c;告诉你接下来…...

Perl语言简介

Perl语言&#xff0c;全称为Practical Extraction and Report Language&#xff08;实用提取与报告语言&#xff09;&#xff0c;是一种高级、通用、解释型的编程语言。它由Larry Wall于1987年首次发布&#xff0c;并迅速因其强大的文本处理能力和高度的灵活性而受到广泛应用。…...

像素幻梦·创意工坊部署教程:Mac M1/M2芯片原生运行FLUX.1-dev像素生成

像素幻梦创意工坊部署教程&#xff1a;Mac M1/M2芯片原生运行FLUX.1-dev像素生成 1. 前言&#xff1a;认识像素幻梦创意工坊 像素幻梦创意工坊(Pixel Dream Workshop)是一款专为像素艺术创作设计的AI工具&#xff0c;基于最新的FLUX.1-dev扩散模型构建。与传统的AI绘图工具不…...

Realistic Vision V5.1 为SolidWorks模型渲染宣传图:工业设计可视化新流程

Realistic Vision V5.1 为SolidWorks模型渲染宣传图&#xff1a;工业设计可视化新流程 你是不是也遇到过这种情况&#xff1f;在SolidWorks里精心设计了一个产品模型&#xff0c;到了要出宣传图、给客户展示或者做方案汇报的时候&#xff0c;就头疼了。要么得花大半天甚至几天…...

DAMOYOLO-S入门教程:如何扩展自定义类别——微调适配行业新标签

DAMOYOLO-S入门教程&#xff1a;如何扩展自定义类别——微调适配行业新标签 你是不是遇到过这样的问题&#xff1f;手头有一个很棒的通用目标检测模型&#xff0c;比如DAMOYOLO-S&#xff0c;它识别猫猫狗狗、汽车行人很在行&#xff0c;但你想让它帮你检测生产线上的特定零件…...

雪女-斗罗大陆-造相Z-Turbo环境配置:MATLAB与AI模型的联合仿真

雪女-斗罗大陆-造相Z-Turbo环境配置&#xff1a;MATLAB与AI模型的联合仿真 最近在折腾一个挺有意思的项目&#xff0c;想把MATLAB强大的工程计算能力和现在流行的AI生成模型结合起来。你可能也遇到过类似的情况&#xff1a;用MATLAB跑完一堆仿真&#xff0c;生成了海量的数据和…...

多轴点焊机器人产业动能强劲:538.2亿元市场规模奠基,2032年将跃升至近1154.9亿元

据恒州诚思调研统计&#xff0c;2025年全球多轴点焊机器人市场规模约达538.2亿元。在全球工业自动化浪潮的推动下&#xff0c;预计未来该市场将持续平稳增长&#xff0c;到2032年市场规模将接近1154.9亿元&#xff0c;未来六年复合年均增长率&#xff08;CAGR&#xff09;为11.…...

中考真题资源合集

2024版《万唯中考真题分类》合集 文件大小: 2.2GB内容特色: 2024版万唯中考真题按考点分类&#xff0c;全科覆盖适用人群: 初三学生、教师、家长陪读备考核心价值: 刷透真题&#xff0c;精准查漏补缺&#xff0c;冲刺高分下载链接: https://pan.quark.cn/s/73347caeee74 2026…...

5分钟搞定COCO数据集下载与配置:从官网到百度云全攻略(附多线程加速技巧)

COCO数据集极速获取指南&#xff1a;从官方源到镜像站的全链路方案 刚接触计算机视觉的新手们&#xff0c;往往在第一步获取数据集时就遭遇"劝退"——动辄几十GB的COCO数据集&#xff0c;官网下载速度堪比蜗牛爬行&#xff0c;百度云限速让人抓狂。本文将分享一套经过…...

技术经理必修管理知识:从管理到领导——高阶技术管理者的自我修养

08-技术经理必修管理知识&#xff1a;从管理到领导——高阶技术管理者的自我修养管理者正确地做事&#xff0c;领导者做正确的事。管理的终点是效率&#xff0c;领导的起点是方向。当你开始思考"我们该往哪里走"而不是"我们该怎么走快一点"&#xff0c;你就…...

电镀生产线组态王6.55和三菱PLC联机仿真程序10(OPC通讯)带运行效果操作讲解视频和设计...

电镀生产线组态王6.55和三菱PLC联机仿真程序10&#xff08;OPC通讯&#xff09;带运行效果操作讲解视频和设计要求io表接线图主电路CAD曲线报表报警界面作为一名高级程序员兼IT知识写手&#xff0c;我将按照您的要求创作一篇关于电镀生产线组态王6.55和三菱PLC联机仿真程序10&a…...

1746-IB32控制器模块

1746-IB32 控制器模块特点由 Allen-Bradley 生产&#xff0c;属于 SLC 500 系列类型为 数字输入模块&#xff0c;用于采集开关量信号单槽设计&#xff0c;可直接安装在 SLC 500 机架提供 32 点输入通道&#xff0c;满足多点监控需求输入电压范围广&#xff08;通常 24V DC&…...