Android 简述touch事件中的MotionEvent
有关touchEvent的事件里都有一个 MotionEvent 參数,以下来简介一下它的属性的一些含义和使用的方法
通常单指操作时,一般例如以下:
- switch (event.getAction()) {//第一个触摸点
- case MotionEvent.ACTION_DOWN: //按下 = 0
- float x = event.getX();
- break;
- case MotionEvent.ACTION_MOVE: //移动 = 2
- break;
- case MotionEvent.ACTION_UP: // 抬起 = 1
- break;
- }
多点触摸时:
下面属性在api level 5出现,api level 8过时。
MotionEvent.ACTION_POINTER_1_DOWN
MotionEvent.ACTION_POINTER_2_DOWN
MotionEvent.ACTION_POINTER_3_DOWN
MotionEvent.ACTION_POINTER_1_UP
MotionEvent.ACTION_POINTER_2_UP
MotionEvent.ACTION_POINTER_3_UP
api level 8 即2.2后起用:MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP
通过下面測试发现。多点触摸时,
- switch (event.getAction()) {
- // case MotionEvent.ACTION_DOWN: //按下 = 0
- // System.out.println("onTouchEvent");
- // break;
- // case MotionEvent.ACTION_MOVE://移动 = 2
- //
- // break;
- // case MotionEvent.ACTION_UP:// 抬起 = 1
- //
- // break;
- case MotionEvent.ACTION_POINTER_DOWN://非第一个触摸点按下 = 5
- System.out.println("ACTION_POINTER_DOWN");
- break;
- case MotionEvent.ACTION_POINTER_UP: //非第一个触摸点抬起 = 6
- System.out.println("ACTION_POINTER_UP");
- break;
- default:
- break;
- }
MotionEvent.ACTION_POINTER_DOWN、MotionEvent.ACTION_POINTER_UP 未运行
当屏幕上已经有一个点被按住,此时再按下其它点时。才会触发MotionEvent.ACTION_POINTER_DOWN
第二个点以后取x、y坐标值
- float x2 = event.getX(event.getActionIndex());//action index 从0開始到pointer count -1 结束
- float y2 = event.getY(event.getActionIndex());//某个index的触摸点的 相对于当前view的y坐标
- event.getPointerCount(); //触摸点的数量
多点时获取坐标 索引 id 演示样例
- int pointerCount = event.getPointerCount();
- // switch (event.getAction() & MotionEvent.ACTION_MASK) {
- switch (event.getActionMasked()) {
- case MotionEvent.ACTION_DOWN:
- case MotionEvent.ACTION_POINTER_DOWN:
- case MotionEvent.ACTION_MOVE:
- for (int i = 0; i < pointerCount; i++) {
- int id = event.getPointerId(i); //同一点的id值保持不变
- int index = i;//同一点的索引值,是可变的。当由多指逐渐降低时。index--
- dx = (int) event.getX(id);
- dy = (int) event.getY(id);
- }
- invalidate();
- break;
- case MotionEvent.ACTION_CANCEL:
- default:
- break;
- }
演示样例
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- switch (event.getAction() & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN:
- System.out.println("ACTION_DOWN");
- mDownX = (int) event.getX();
- mDownY = (int) event.getY();
- if (flag) {
- return true; //对于onTouchEvent,要return true。才干运行兴许的 move。up
- } else {
- break;
- }
- case MotionEvent.ACTION_MOVE:
- System.out.println("move");
- int moveX = (int) event.getX();
- int moveY = (int) event.getY();
- break;
- case MotionEvent.ACTION_UP:
- System.out.println("ACTION_UP");
- break;
- case MotionEvent.ACTION_POINTER_DOWN: //当屏幕上已经有一个点被按住,此时再按下其它点时触发
- System.out.println("ACTION_POINTER_DOWN");
- break;
- case MotionEvent.ACTION_POINTER_UP:
- System.out.println("ACTION_POINTER_UP");
- break;
- }
- return super.onTouchEvent(event);
- }
输出:
- 06-06 23:25:38.974 11930-11930/com.immoc.canvaspath I/System.out: ACTION_DOWN
- 06-06 23:25:38.974 11930-11930/com.immoc.canvaspath I/System.out: ACTION_POINTER_DOWN
- 06-06 23:25:39.202 11930-11930/com.immoc.canvaspath I/System.out: move
- 06-06 23:25:39.218 11930-11930/com.immoc.canvaspath I/System.out: move
- 06-06 23:25:39.234 11930-11930/com.immoc.canvaspath I/System.out: move
- 06-06 23:25:39.250 11930-11930/com.immoc.canvaspath I/System.out: move
- 06-06 23:25:39.334 11930-11930/com.immoc.canvaspath I/System.out: ACTION_POINTER_UP
- 06-06 23:25:39.334 11930-11930/com.immoc.canvaspath I/System.out: ACTION_UP
Android 简述touch事件中的MotionEvent的更多相关文章
- Android的Touch事件分发机制简单探析
前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClic ...
- Android对touch事件的拦截,在View Tree上的传递顺序
当发生touch事件时,系统会产生一个MotionEvent并且沿着View Tree开始传递.首先获取MotionEvent是View Tree的根节点,根节点通常是一个ViewGroup,View ...
- touch事件中的touches、targetTouches和changedTouches详解
touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表 通过一个例子来区分一下触 ...
- android 管理Touch事件
The onInterceptTouchEvent() method gives a parent the chance to see any touch event before its child ...
- 移动的 touch事件中的touches、targetTouches和changedTouches
touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表 通过一个例子来区分一下触 ...
- touch事件中的touches、targetTouches和changedTouches
touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表; 通过一个例子来区分一下 ...
- Android中的Touch事件
Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...
- Android Touch事件之一:Touch事件在父ViewGroup和子View之间的传递篇
2015-11-26 17:00:22 前言:Android的Touch事件传递和View的实现紧密相连,因此理解Touch事件的传递,有助于我们更好的理解View的工作原理. 1. 几个重要的方法: ...
- Android touch事件的派发流程
Android TouchEvent事件传递机制 通俗易懂,能够了解Touch事件派发的基本流程. Android中的dispatchTouchEvent().onInterceptTouchEven ...
随机推荐
- h5 离线存储
- [COI2007] [luogu P1823] Patrik 音乐会的等待 解题报告 (单调栈)
题目链接:https://www.luogu.org/problemnew/show/P1823 题目: N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人. ...
- SQL Server在用户自定义函数(UDF)中使用临时表
SQL Server在用户自定义函数中UDF使用临时表,这是不允许的. 有时是为了某些特殊的场景, 我们可以这样的实现: CREATE TABLE #temp (id INT) GO INSERT I ...
- Linux Putty 复制粘贴
从putty复制: 用左键选中文字,再其他地方点中键就可以粘贴了,不需要右键粘贴. 在putty中粘贴: 在其他地方用左键选中文字,不用右键复制,保持选中文字高亮,然后在putty中点中键 ...
- 使用sysbench 对mysql进行性能测试
使用sysbench 对mysql进行性能测试 sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有My ...
- java开发微信公众号支付(JSAPI)
https://www.cnblogs.com/gopark/p/9394951.html,这篇文章写的已经很详细了. 下面写一下自己的思路: 1.首先下载demo,地址:https://pay.we ...
- 题解 CF1037D 【Valid BFS?】
不管怎么说,这都不是道紫题吧... 这里采用的思想有点类似轻重链剖分. 我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序. 这样(如果序列没错)肯定会按照序列的方式遍历完全图. ...
- 【C语言】打印1到最大的n位数
//打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数. 比方:输入3.则打印出1.2一直到最大的3位数999 #include <stdio.h> #includ ...
- spring定时器中如何获取servletcontext
spring定时器中如何获取servletcontext 学习了:https://zhidao.baidu.com/question/406212574.html @Scheduled(cron = ...
- [Python] Plotting multiple stocks
import os import pandas as pd import matplotlib.pyplot as plt def test_run(): start_date='2017-01-01 ...