有关touchEvent的事件里都有一个 MotionEvent 參数,以下来简介一下它的属性的一些含义和使用的方法

通常单指操作时,一般例如以下:

  1. switch (event.getAction()) {//第一个触摸点
  2. case MotionEvent.ACTION_DOWN: //按下 = 0
  3. float x = event.getX();
  4. break;
  5. case MotionEvent.ACTION_MOVE: //移动 = 2
  6.  
  7. break;
  8. case MotionEvent.ACTION_UP: // 抬起 = 1
  9.  
  10. break;
  11. }

多点触摸时:

下面属性在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

通过下面測试发现。多点触摸时,

  1. switch (event.getAction()) {
  2. // case MotionEvent.ACTION_DOWN: //按下 = 0
  3. // System.out.println("onTouchEvent");
  4. // break;
  5. // case MotionEvent.ACTION_MOVE://移动 = 2
  6. //
  7. // break;
  8. // case MotionEvent.ACTION_UP:// 抬起 = 1
  9. //
  10. // break;
  11.  
  12. case MotionEvent.ACTION_POINTER_DOWN://非第一个触摸点按下 = 5
  13. System.out.println("ACTION_POINTER_DOWN");
  14. break;
  15.  
  16. case MotionEvent.ACTION_POINTER_UP: //非第一个触摸点抬起 = 6
  17. System.out.println("ACTION_POINTER_UP");
  18. break;
  19. default:
  20. break;
  21. }

MotionEvent.ACTION_POINTER_DOWN、MotionEvent.ACTION_POINTER_UP  未运行

当屏幕上已经有一个点被按住,此时再按下其它点时。才会触发MotionEvent.ACTION_POINTER_DOWN

第二个点以后取x、y坐标值

  1. float x2 = event.getX(event.getActionIndex());//action index 从0開始到pointer count -1 结束
  2. float y2 = event.getY(event.getActionIndex());//某个index的触摸点的 相对于当前view的y坐标
  3. event.getPointerCount(); //触摸点的数量

多点时获取坐标 索引 id 演示样例

  1. int pointerCount = event.getPointerCount();
  2. // switch (event.getAction() & MotionEvent.ACTION_MASK) {
  3. switch (event.getActionMasked()) {
  4. case MotionEvent.ACTION_DOWN:
  5. case MotionEvent.ACTION_POINTER_DOWN:
  6. case MotionEvent.ACTION_MOVE:
  7. for (int i = 0; i < pointerCount; i++) {
  8. int id = event.getPointerId(i); //同一点的id值保持不变
  9. int index = i;//同一点的索引值,是可变的。当由多指逐渐降低时。index--
  10. dx = (int) event.getX(id);
  11. dy = (int) event.getY(id);
  12. }
  13. invalidate();
  14. break;
  15. case MotionEvent.ACTION_CANCEL:
  16.  
  17. default:
  18. break;
  19. }

演示样例

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  4. case MotionEvent.ACTION_DOWN:
  5. System.out.println("ACTION_DOWN");
  6. mDownX = (int) event.getX();
  7. mDownY = (int) event.getY();
  8. if (flag) {
  9. return true; //对于onTouchEvent,要return true。才干运行兴许的 move。up
  10. } else {
  11. break;
  12. }
  13.  
  14. case MotionEvent.ACTION_MOVE:
  15. System.out.println("move");
  16. int moveX = (int) event.getX();
  17. int moveY = (int) event.getY();
  18.  
  19. break;
  20.  
  21. case MotionEvent.ACTION_UP:
  22. System.out.println("ACTION_UP");
  23. break;
  24.  
  25. case MotionEvent.ACTION_POINTER_DOWN: //当屏幕上已经有一个点被按住,此时再按下其它点时触发
  26. System.out.println("ACTION_POINTER_DOWN");
  27.  
  28. break;
  29.  
  30. case MotionEvent.ACTION_POINTER_UP:
  31. System.out.println("ACTION_POINTER_UP");
  32.  
  33. break;
  34.  
  35. }
  36. return super.onTouchEvent(event);
  37. }

输出:

  1. 06-06 23:25:38.974 11930-11930/com.immoc.canvaspath I/System.out: ACTION_DOWN
  2. 06-06 23:25:38.974 11930-11930/com.immoc.canvaspath I/System.out: ACTION_POINTER_DOWN
  3. 06-06 23:25:39.202 11930-11930/com.immoc.canvaspath I/System.out: move
  4. 06-06 23:25:39.218 11930-11930/com.immoc.canvaspath I/System.out: move
  5. 06-06 23:25:39.234 11930-11930/com.immoc.canvaspath I/System.out: move
  6. 06-06 23:25:39.250 11930-11930/com.immoc.canvaspath I/System.out: move
  7. 06-06 23:25:39.334 11930-11930/com.immoc.canvaspath I/System.out: ACTION_POINTER_UP
  8. 06-06 23:25:39.334 11930-11930/com.immoc.canvaspath I/System.out: ACTION_UP

Android 简述touch事件中的MotionEvent的更多相关文章

  1. Android的Touch事件分发机制简单探析

    前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClic ...

  2. Android对touch事件的拦截,在View Tree上的传递顺序

    当发生touch事件时,系统会产生一个MotionEvent并且沿着View Tree开始传递.首先获取MotionEvent是View Tree的根节点,根节点通常是一个ViewGroup,View ...

  3. touch事件中的touches、targetTouches和changedTouches详解

    touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表 通过一个例子来区分一下触 ...

  4. android 管理Touch事件

    The onInterceptTouchEvent() method gives a parent the chance to see any touch event before its child ...

  5. 移动的 touch事件中的touches、targetTouches和changedTouches

    touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表 通过一个例子来区分一下触 ...

  6. touch事件中的touches、targetTouches和changedTouches

    touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表; 通过一个例子来区分一下 ...

  7. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  8. Android Touch事件之一:Touch事件在父ViewGroup和子View之间的传递篇

    2015-11-26 17:00:22 前言:Android的Touch事件传递和View的实现紧密相连,因此理解Touch事件的传递,有助于我们更好的理解View的工作原理. 1. 几个重要的方法: ...

  9. Android touch事件的派发流程

    Android TouchEvent事件传递机制 通俗易懂,能够了解Touch事件派发的基本流程. Android中的dispatchTouchEvent().onInterceptTouchEven ...

随机推荐

  1. h5 离线存储

  2. [COI2007] [luogu P1823] Patrik 音乐会的等待 解题报告 (单调栈)

    题目链接:https://www.luogu.org/problemnew/show/P1823 题目: N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人. ...

  3. SQL Server在用户自定义函数(UDF)中使用临时表

    SQL Server在用户自定义函数中UDF使用临时表,这是不允许的. 有时是为了某些特殊的场景, 我们可以这样的实现: CREATE TABLE #temp (id INT) GO INSERT I ...

  4. Linux Putty 复制粘贴

    从putty复制:    用左键选中文字,再其他地方点中键就可以粘贴了,不需要右键粘贴. 在putty中粘贴:    在其他地方用左键选中文字,不用右键复制,保持选中文字高亮,然后在putty中点中键 ...

  5. 使用sysbench 对mysql进行性能测试

    使用sysbench 对mysql进行性能测试 sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有My ...

  6. java开发微信公众号支付(JSAPI)

    https://www.cnblogs.com/gopark/p/9394951.html,这篇文章写的已经很详细了. 下面写一下自己的思路: 1.首先下载demo,地址:https://pay.we ...

  7. 题解 CF1037D 【Valid BFS?】

    不管怎么说,这都不是道紫题吧... 这里采用的思想有点类似轻重链剖分. 我们按照每个节点在序列里面出现的顺序,把每一个节点连出去的边都排一个序. 这样(如果序列没错)肯定会按照序列的方式遍历完全图. ...

  8. 【C语言】打印1到最大的n位数

    //打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数. 比方:输入3.则打印出1.2一直到最大的3位数999 #include <stdio.h> #includ ...

  9. spring定时器中如何获取servletcontext

    spring定时器中如何获取servletcontext 学习了:https://zhidao.baidu.com/question/406212574.html @Scheduled(cron = ...

  10. [Python] Plotting multiple stocks

    import os import pandas as pd import matplotlib.pyplot as plt def test_run(): start_date='2017-01-01 ...