android touch事件坐标原点,Android onTouch事件与手势操作

27aad793a122a7f2f38e87ce85e6e12f.gif

触摸,手势操作已经很好的融入了我们的生活。那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习。

先看效果图

5ddd9743559c0c0d3f2a0eb3df62ccbf.gif

如上图所示,就是一个跟随手指移动的按钮。用来演示我们接下来要说的onTouch事件和手势操作。

为了让大家看懂里面的代码,我们来先介绍一下基础知识。

onTouch事件

做什么都好先了解原理以后的工作就会更简单,关于手势以及我们熟悉的onclick,

onLongClick事件都是基于对onTouch事件的捕捉和处理。那么在使用手势工具类的前提下我们应该去学习了解基本的onTouch事件。

onTouch常用的以下4个事件:

1、ACTION_DOWN:

表示按下了屏幕,第一个执行也是必然执行的方法。

2、ACTION_MOVE:

表示为移动手势,会不断的执行直到触摸停止。

3、ACTION_UP:

表示为离开屏幕,触摸停止的时候执行。

4、ACTION_CANCEL:

表示取消手势,不会由用户产生,而是由程序产生的。

一个Action_DOWN,多个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。

onTouch的参数

View

受到Touch事件的view对象

MotionEvent

包含的事件的详细信息,例如触摸点的信息,触摸事件类型的信息等

MotionEvent的方法例如getRowX所描述的都是触摸点的信息。

几个重要方法的说明:

getRowX:触摸点相对于屏幕的坐标

getX: 触摸点相对于view的坐标

getTop: 按钮左上角相对于父view(LinerLayout)的y坐标

getLeft: 按钮左上角相对于父view(LinerLayout)的x坐标

onTouch的返回值

这个部分涉及到事件传递和处理机制,详细的不在此介绍。

作用:

这里的返回值代表的是,对于这个触摸事件touch是否已经处理完成。

如果我们设置返回值为true代表的是处理完成,这样就不会再传递给下一个对象。也就是说后面的控件或者对象就不会接收到触摸事件了。

反之,后面的对象或控件会在此接收到这个触摸事件并被调用。

实践

在学习基础知识之后,我们来看看如何使用这些来实现一个可以拖动的按钮吧。

思路

这里的主要思路就是在ACTION_DOWN按下的第一时间记录下初始的状态,在ACTION_MOVE滑动事件中不断的刷新按钮的位置。

为了保证有我们正常理解下的点击事件发生,下面我还加了位置是否移动的判断。

下面是实现该功能的内部类class MyOnTouch implements OnTouchListener{

int[] temp = new int[] { 0, 0 };

Boolean ismove = false;

int downX = 0;

int downY = 0;

@Override

public boolean onTouch(View v, MotionEvent event) {

int eventaction = event.getAction();

int x = (int) event.getRawX();

int y = (int) event.getRawY();

switch (eventaction) {

case MotionEvent.ACTION_DOWN: // touch down so check if the

temp[0] = (int) event.getX();

temp[1] = y - v.getTop();

downX = (int) event.getRawX();

downY = (int) event.getRawY();

ismove = false;

break;

case MotionEvent.ACTION_MOVE: // touch drag with the ball

v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight());

if (Math.abs(downX - x) > 10 || Math.abs(downY - y) > 10)

ismove = true;

break;

case MotionEvent.ACTION_UP:

if (!ismove)

Toast.makeText(MainActivity.this, "你点击了这个按钮", Toast.LENGTH_LONG).show();

break;

}

return false;

}

}

然后在给按钮初始化的时候设置这个事件touchButton.setOnTouchListener(new MyOnTouch());

手势操作

关于手势操作,这里其实说的是Android提供的工具类,通过GestureDetector类来识别和处理onTouch事件,简化使用。

一般用到下面的三个类。

android.view.GestureDetector

手势操作的识别类,通过他来使用下面的识别接口。

android.view.GestureDetector.SimpleOnGestureListener

手势识别的接口类,使用他可以按需重载自己想要的方法,方法多

android.view.GestureDetector.OnGestureListener;

手势识别的类,SimpleOnGestureListener接口的父类。使用他需要实现他所有的方法。

方法说明:

OnGestureListener有下面的几个方法:

按下(onDown):

在按下时调用。

抛掷(onFling):

手指在触摸屏上迅速移动,并松开的动作。

长按(onLongPress):

手指按在持续一段时间,并且没有松开。

滚动(onScroll):

手指在触摸屏上滑动。

按住(onShowPress):

手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

抬起(onSingleTapUp):

手指离开触摸屏的那一刹那。

SimpleOnGestureListener比OnGestureListener多出来的方法:

双击(onDoubleTap)

双击的第二下Touch down时触发

双击事件(onDoubleTapEvent)

双击的第二下Touch down和up都会触发一次,可用e.getAction()区分。

实践

好了,学习完了基础知识之后我们来用手势操作的工具类来实现我们的小按钮吧。

下面来实现我们的手势操作内部类。这里我直接实现了OnGestureListener接口,为了更好的演示效果。class MyGesture implements OnTouchListener, OnGestureListener {

GestureDetector myGesture = new GestureDetector(MainActivity.this,this);

View view = null;

int[] temp = new int[] { 0, 0 };

@Override

public boolean onTouch(View v, MotionEvent event) {

//这一步只是我的强迫症而已,因为onTouch事件是不断被调用的

if(view == null)

view = v;

myGesture.onTouchEvent(event);

return false;

}

//在按下时调用

@Override

public boolean onDown(MotionEvent e) {

temp[0] = (int) e.getX();

temp[1] = ((int) e.getRawY()) - view.getTop();

return false;

}

//手指在触摸屏上迅速移动,并松开的动作。

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

return false;

}

//长按的时候调用

@Override

public void onLongPress(MotionEvent e) {

}

//按住然后滑动时调用

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2,

float distanceX, float distanceY) {

int x = (int) e2.getRawX();

int y = (int) e2.getRawY();

view.layout(x - temp[0], y - temp[1], x + view.getWidth() - temp[0], y - temp[1] + view.getHeight());

return false;

}

// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发

// 注意和onDown()的区别,强调的是没有松开或者拖动的状态

@Override

public void onShowPress(MotionEvent e) {

}

// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发

@Override

public boolean onSingleTapUp(MotionEvent e) {

Toast.makeText(MainActivity.this, "你点击了按钮", Toast.LENGTH_LONG).show();

return false;

}

}

然后在使用的时候给我们的按钮设置进去就好了touchButton.setOnTouchListener(new MyGesture());

在内部类的开头初始化我们的GestureDetector处理类GestureDetector myGesture = new GestureDetector(MainActivity.this,this);

在onTouch方法中调用GestureDetector的方法myGesture.onTouchEvent(event);

关于按钮功能的说明:

可以拖动的按钮,这个功能的核心代码是v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight());

在滑动事件中调用view.layout(int l, int t, int r, int b)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年技术盘点容器篇(二):听腾讯云讲讲踏入成熟期的容器技术 | 程序员硬核评测...

戳蓝字“CSDN云计算”关注我们哦!作者:刘晶晶据相关调研机构出具的报告数据显示,目前应用容器市场规模将从2016年的 7.62亿美元增长到2020年的27亿美元。显而易见,引入容器所展现的巨大灵活性有效推动了其采用速率,使企…

阿里云容器服务新增支持Kubernetes编排系统,性能重大提升

摘要: 作为容器编排系统的两大流派, Kubernetes和Swarm的重要性不言而喻。融合了两大高性能集成的阿里云容器服务,不仅可以降低50%的基础架构成本,提高交付速度将产品迭代加快13倍,还可以实现秒级的海量容器启动、秒级…

实战_01_Spring SpringMVC 整合Mybaits

文章目录一、技术选型1.1. maven坐标说明1.2. 环境准备二、工程所属关系2.1. 项目结构总览2.2. 工程所属关系总览三、创建聚合工程3.1. 聚合工程_ly-parent3.2. 聚合工程_ly-manager四、创建子项目4.1 创建子工程服务ly-common4.2 创建子工程服务ly-entity4.3 创建子工程服务ly…

Android热修复升级探索——代码修复冷启动方案

摘要: 前面一篇文档, 我们提到热部署修复方案有诸多特点(有关热部署修复方案实现, Android热修复升级探索——追寻极致的代码热替换)。其根本原理是基于native层方法的替换, 所以当类结构变化时&#xff0c…

K8S精华问答 | 应用和运行时平台是怎样解耦的?

kubernetes,简称K8S,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应…

android放在上个元素的左边代码,控件悬浮在某个控件之上 Android五大布局方式——相对布局(RelativeLayout)属性详解...

如图所示,想要实现搜索框在轮播图上面,不管滑动与否,这个组合控件都在上面1.就要用到RelativeLayout,相对于父元素定位,而且这个搜索框的组合控件必须要放在所有控件下面,在使用android:layout_alignParentTop"true"这个属性,贴紧父元素的上边缘.代码实现RelativeLay…

新功能:在负载均衡SLB控制台上查看DDoS安全防护阈值

摘要: 负载均衡作为业务系统的公网入口,承载海量访问请求的分发,常常也是DDoS攻击的对象,因此阿里云提供了免费的DDoS防护(云盾),详情可以参考之前的博文《聊一聊负载均衡SLB的DDoS防护》。 由于…

实战_02_Spring SpringMVC 整合Mybaits

接上一篇:企业实战_01_Spring SpringMVC 整合Mybaits https://blog.csdn.net/weixin_40816738/article/details/101343414 文章目录一、数据库操作1.1. 创建数据库1.2. 表结构二、整合实战2.1. 整合思路2.1.1. Dao层2.1.2. service层2.1.3. Dao层表现层2.2. Dao整合…

自动化测试 之 “好用例、坏用例”

摘要: 自动化测试的重要性显而易见,但自动化测试又无法解决所有问题,所以说完全依赖自动化是不可能的,但完全没有自动化是万万不能。在软件开发项目中,重度依赖人力进行持续回归是一件非常枯燥的重复工作。企业需要花费…

重磅!Python又第一了!网友:为什么找不到好工作?真相让人脸红…

根据第 19 届 KDnuggets调查显示,Python 成数据分析、数据科学与机器学习的第一大语言。图片来源于第 19 届 KDnuggets软件大调查Python 在机器学习中的地位日益扩大,2017 年,机器学习中Python 的使用率超过 50%,今年则直接上升到…

Apache RocketMQ 深圳沙龙报名开启!

摘要: Apache RocketMQ深圳沙龙报名正式开启。12月16日,Apache RocketMQ将在深圳举办线下沙龙!届时,社区里的PMC Member、Committer、深度用户,来自各路的资深专家汇聚一堂,就分布式消息引擎的最佳实践、性…

震惊!微软小冰公众号被封?示好国内,苹果拟推出特色版iPhone;谷歌更新Google Play支持名单:华为荣耀多款在列……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go AppsFlyer 针对中国移动互联…

如何基于OSS和MTS,快速搭建音视频文件上传服务?

摘要: 背景 本文主要介绍如何基于OSS服务和MTS的上传SDK,快速搭建一个音视频文件上传服务。 优势 使用MTS的上传SDK上传音视频文件,具有以下优势: 增加文件列表管理功能。 增加STS Token 超时更新功能。 背景 本文主要介绍如何基…

IntelliJ IDEA 2019.1 windows找不到文件‘chrome’

文章目录一、问题现象1. 用IntelliJ IDEA 2019.1 打开index.html,抛出以下错误2. 异常效果图二、解决方案:2.1.【打开设置】2.2. 搜索【web brow】2.3. 在桌面上找到google-【右击】-【属性】-【找到目标】-【双击】-【ctrla全选】-【ctrlc复制】2.4. 在红框中&…

新功能:阿里云负载均衡支持HTTP/2、WSS协议

摘要: 很高兴的告诉大家,阿里云负载均衡在欧洲中部(法兰克福)与亚太东南3(吉隆坡)地域支持HTTP/2、WSS(Web Socket Secure)协议。 1、HTTP/2协议支持 什么是HTTP/2 HTTP2是超文本传输…

wds linux,linux 无线组网方式 WDS功能

扩展你的无线网络:使用WDS扩展WDS设置无线分布式系统WDS(Wireless Distribution System),在无线网络扩展中扮演着最重要的角色,它可以帮你轻松的实现无线到无线的扩展,而中间不必使用任何有线的连接,这在看中美观的家庭…

三十四载Windows崛起之路: 苹果、可视做过微软“铺路石”

戳蓝字“CSDN云计算”关注我们哦!作者:姜洪军1982年11月的一天,赌城拉斯维加斯客流如织,有常见的闲散赌客,但更多的是来自计算机产业的专业人士,因为计算机领域的重要博览会Comdex在这里举行。27岁的比尔盖…

阿里云CDN直播架构与双11晚会直播实战

摘要: 分享人:阿里云CDN直播 高级技术专家 阙寒分享内容:双11直播活动是众多直播活动中非常典型的场景,离不开直播本身这个话题。所以今天的分享会从直播概述、直播架构、业务功能、直播监控、双11这几个方面来进行。 分享人&…

双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘

摘要: 还记得那些年我们半夜爬起来重启服务器的黑暗历史吗?双11期间,阿里巴巴百万量级主机管理能安全、稳定、高效,如丝般顺滑是如何做到的?阿里巴巴运维中台技术专家宋意,首次直播揭秘阿里IT运维的基础设施…

查看大日志文件的专门工具logviewer

查看大日志文件的专门工具logviewer版本为官网2.3.1版本 文章目录一、百度网盘下载链接:二、操作手册2.1. 【file】-【Open】-【选择文件】-【打开】2.2. 文本可视化展示2.3. 编码选择2.4. 效果图2.5. 搜索功能一、百度网盘下载链接: 链接https://pan.b…