转自:http://www.cnphp6.com/archives/59948?utm_source=tuicool&utm_medium=referral

一、一些常量

常见的动作常量:

public static final int ACTION_DOWN             = 0;单点触摸动作

    public static final int ACTION_UP               = 1;单点触摸离开动作
    public static final int ACTION_MOVE             = 2;触摸点移动动作
    public static final int ACTION_CANCEL           = 3;触摸动作取消
     public static final int ACTION_OUTSIDE          = 4;触摸动作超出边界
    public static final int ACTION_POINTER_DOWN     = 5;多点触摸动作
    public static final int ACTION_POINTER_UP       = 6;多点离开动作

   以下是一些非touch事件
    public static final int ACTION_HOVER_MOVE       = 7;
    public static final int ACTION_SCROLL           = 8;
    public static final int ACTION_HOVER_ENTER      = 9;
    public static final int ACTION_HOVER_EXIT       = 10;

掩码常量

ACTION_MASK = 0X000000ff动作掩码
 ACTION_POINTER_INDEX_MASK = 0X0000ff00触摸点索引掩码

ACTION_POINTER_INDEX_SHIFT = 8 获取触摸点索引需要移动的位数

另注:对于TextView来说,只有Action_DOWN能被检测,Action_up, action_cancel都检测不到,讲TextView控件换成Button则都能检测到MotionEvent事件。一般action_cancel事件必须实现,因为当快速滑过button时,action_up则不被检测执行,需要action_cancel来执行事件。

二、相关方法

getAction()方法返回的是int类型,用到的只有低16位,其中:低八位是动作的类型,高8位是触摸点索引值的表示(单点为0,双点为1)

获得动作类型: int action = event.getAction() & ACTION_MASK 或者使用 getActionMasked()

获得触摸点索引类型: int pointerIndex = (event.getAction() & ACTION_POINTER_INDEX_MASK ) >> ACTION_POINTER_INDEX_SHIFT

或者使用 getActionIndex()

为什么要有索引信息?

有了索引信息,我们可以在onTOuchEvent事件中判断传进来的MotionEvent对象对应的是单点信息还是多点信息。

下面的代码段能使用户在屏幕上拖动一个对象。它记录了初始点的位置,计算点移动的距离,并将对象移动到新的位置。它正确的处理了这种情况:当第一个手指把控件拖到一个位置,然后按下第二个手指,且第二个手指与同一个控件上。当用户抬起第一个手指时,控件不会跑到第二个手指的位置同时第二个手指可以继续拖动控件。

[java] view plaincopy

  1. // The ‘active pointer’ is the one currently moving our object.

  2. private int mActivePointerId = INVALID_POINTER_ID;

  3. @Override

  4. public boolean onTouchEvent(MotionEvent ev) {

  5. // Let the ScaleGestureDetector inspect all events.

  6. mScaleDetector.onTouchEvent(ev);

  7. final int action = MotionEventCompat.getActionMasked(ev);

  8. switch (action) {

  9. case MotionEvent.ACTION_DOWN: {

  10. final int pointerIndex = MotionEventCompat.getActionIndex(ev);

  11. final float x = MotionEventCompat.getX(ev, pointerIndex);

  12. final float y = MotionEventCompat.getY(ev, pointerIndex);

  13. // Remember where we started (for dragging)

  14. mLastTouchX = x;

  15. mLastTouchY = y;

  16. // Save the ID of this pointer (for dragging)

  17. mActivePointerId = MotionEventCompat.getPointerId(ev, 0);

  18. break;

  19. }

  20. case MotionEvent.ACTION_MOVE: {

  21. // Find the index of the active pointer and fetch its position

  22. final int pointerIndex =

  23. MotionEventCompat.findPointerIndex(ev, mActivePointerId);

  24. final float x = MotionEventCompat.getX(ev, pointerIndex);

  25. final float y = MotionEventCompat.getY(ev, pointerIndex);

  26. // Only move if the ScaleGestureDetector isn’t processing a gesture.

  27. if (!mScaleDetector.isInProgress()) {

  28. // Calculate the distance moved

  29. final float dx = x – mLastTouchX;

  30. final float dy = y – mLastTouchY;

  31. mPosX += dx;

  32. mPosY += dy;

  33. invalidate();

  34. }

  35. // Remember this touch position for the next move event

  36. mLastTouchX = x;

  37. mLastTouchY = y;

  38. break;

  39. }

  40. case MotionEvent.ACTION_UP: {

  41. mActivePointerId = INVALID_POINTER_ID;

  42. break;

  43. }

  44. case MotionEvent.ACTION_CANCEL: {

  45. mActivePointerId = INVALID_POINTER_ID;

  46. break;

  47. }

  48. case MotionEvent.ACTION_POINTER_UP: {

  49. final int pointerIndex = MotionEventCompat.getActionIndex(ev);

  50. final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);

  51. if (pointerId == mActivePointerId) {

  52. // This was our active pointer going up. Choose a new

  53. // active pointer and adjust accordingly.

  54. final int newPointerIndex = pointerIndex == 0 ? 1 : 0;

  55. mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex);

  56. mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex);

  57. mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);

  58. }

  59. break;

  60. }

  61. }

  62. return true;

  63. }

MotionEvent还包含了移动操作中其它历史移动数据以方便处理触控的移动操作.

android sdk对于这个类的描述中就有这么一句:

For efficiency, motion events with ACTION_MOVE may batch together multiple movement samples within a single object.

Android触控基础 MotionEvent相关推荐

  1. Android触控基础:MotionEvent

    之前的文章层从Framework层介绍了Android Touch事件即(MotionEvent)的传递机制.本文将详细介绍MotionEvent的一些成员和方法.了解了MotionEvent对开发一 ...

  2. Android多点触控之——MotionEvent(触控事件)

    今天晚上刚学习了一个多点触控的小程序,后面想对其做一个定制.在写的时候遇到很多问题,于是乎就查了一下API文档,又到网上查了一下高手的文章,最后自己又实践了一下.终于把多点触控事件监听的大概原理给弄清 ...

  3. Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程) 分类:Androidandroid实例...

    1.当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vie ...

  4. 定制android触控平板,Adobe发表六款Android平板用触控Apps,一套六款的工具组合

    Adobe 在十月时发表了它们的触控 Apps 家族 -- 一套六款的工具组合,把拥有触控界面的平板电脑,用在让生活更轻松.创意更容易发挥之处,成为更好用的设计工具.现在,这些软件也可以在 Andro ...

  5. 触控事件MotionEvent

    MotionEvent中封装的一些常用的事件常量: //单点触摸按下动作 public static final int ACTION_DOWN = 0; //单点触摸抬起动作 public stat ...

  6. android 触控优化,太滑手了,安卓这款触控优化神器要逆天!

    原标题: 太滑手了,安卓这款触控优化神器要逆天! 最近国外一款很火的优化工具"Super Touch" 中文名[超级触控],它可以提升触控反应速度,手感媲美iPhone,令人惊讶的 ...

  7. Android触控手感没有苹果好,硬核科普:为什么iPhone玩游戏的手感比大部分安卓都强?...

    我们知道,现在安卓旗舰愈发强调"触控采样率"的概念,理论上,这一配置的数值越高,手机玩游戏的跟手度与手感也就越好.如今顶配如小米11已将"触控采样率"提升至48 ...

  8. ipad和android触控笔不通用,电容笔能取代apple pencil在iPad上使用吗?不看后悔!

    随着iPad等平板设备的日渐普及,大家都习惯了在iPad上学习.工作.绘画.娱乐等,因为iPad不仅小巧便携,而且功能也日渐强大,相对于笨拙的笔记本电脑更加方便,但是iPad专用的apple penc ...

  9. 多点触控之MotionEvent.ACTION_MASK的作用

    (1) 在onTouchEvent(MotionEvent event)中,使用switch (event.getAction())可以处理ACTION_DOWN和ACTION_UP事件:ACTION ...

最新文章

  1. 数字线索: F-35单价已低于四代机,其成本控制是如何实现的?
  2. Android RecyclerView使用GridLayoutManager间距设置
  3. java大数BinInteger
  4. eclipse 国内镜像高速下载
  5. 体验AJAX Toolkit新控件:AutoCompleteExtender
  6. android中Canvas使用drawBitmap绘制图片
  7. go调用python脚本_谁能取代Python?我使用Go来部署机器学习模型的原因
  8. 暑假集训单切赛第一场 CF 191A Dynasty Puzzles
  9. 使用工具安装,运行,停止,卸载Window服务
  10. 浮栅场效应管 符号_华成英 - 模拟电子技术基础 | 场效应管
  11. HTML用来显示计算机代码的标签 pre 预定义格式标签
  12. 陈玉琴老师的中医理学
  13. 2021年全球及中国区块链投融资及技术专利情况:中国区块链相关注册企业达到9.36万余家,新增专利15985项 [图]
  14. android 7红米3,红米7 3+64也并没有想象中那么差,开箱+上手初体验
  15. 一则 HTTP 405 Method Not Allowed 的解决办法
  16. 攻防世界 逆向 logmein
  17. php5.4 eregi,帮助将PHP eregi转换为preg_match
  18. macbook历代_你都见过吗?苹果Mac历代台式机回忆录
  19. 【Python 3.7】熟食店:创建一个名为 sandwich_orders 的列表,在其中包含各种三明治的名 字;再创建一个名为 finished_sandwiches 的空列表……
  20. Dissect ActiveX Control Safety

热门文章

  1. Reflect介绍,及常用的方法
  2. 元宇宙买房爆赚1000倍?
  3. mysql describe什么意思_MySQL中describe命令的使用方法小结
  4. 一个角色扮演游戏为例,告诉大家面向对象编程是有用的
  5. 基于YOLOv4的绝缘子检测算法
  6. Android蓝牙连接问题总结
  7. 萌想科技之微博运营面试
  8. Http,Https,Html
  9. gmtime 和 localtime 的区别
  10. 电商工具箱之淘客检测