文章目录

  • I . 多点触控事件
  • II . PointerId 与 PointerIndex 简介
  • III . 本次 PointerId 与 PointerIndex 获取
  • IV . PointerId 与 PointerIndex 互相转化
  • V . 触摸点个数获取 ( getPointerCount )
  • VI . 触摸点坐标获取
  • VII . 多点触控 示例代码 ( 参考 )

I . 多点触控事件


1 . 多点触控事件 :

① ACTION_DOWN : 第一个手指按下

② ACTION_MOVE : 所有的手指移动

③ ACTION_UP : 最后一个手指抬起

④ ACTION_POINTER_DOWN : 中间的手指按下 ( 已经有手指按下 )

⑤ ACTION_POINTER_UP : 中间手指抬起 ( 还有手指在触摸中 )

2 . 获取多点触控事件 : 调用 MotionEvent 对象的 getActionMasked() 可以获取多点触控事件 , 即上面的 5 种触摸事件 ;

3 . 获取并处理多点触控事件代码示例 :

① 获取多点触控事件 :

//获取当前的多点触控触摸事件
int actionMasked = event.getActionMasked();

② 处理多点触控事件 :

//处理 5种多点触控事件
switch (actionMasked){case MotionEvent.ACTION_DOWN :          //第一个手指按下break;case MotionEvent.ACTION_MOVE :          //手指移动break;case MotionEvent.ACTION_UP :            //最后一个手指抬起break;case MotionEvent.ACTION_POINTER_DOWN :  //中间的手指按下 ( 已经有手指按下 )break;case MotionEvent.ACTION_POINTER_UP :    //中间手指抬起 ( 还有手指在触摸中 )break;}

II . PointerId 与 PointerIndex 简介


1 . Pointer 触摸点 :

① PointerId : 触摸点标识 , 一旦赋值不可更改 ;

手指按下 , 该触摸点产生 自带触摸点 ID 属性 , 以及分配一个触摸点索引 , 当手指抬起 , 该触摸点 ID 值回收 ; 期间触摸点 ID 不会改变 ;

② PointerIndex : 触摸点索引 , 触摸点的索引值可能会变 ;

该值从 0 开始计数 , 取值范围是 0 ~ 触摸点个数 - 1 , 每当有一个中间触摸点抬起 , 后面的触摸点就会依次替补该空缺 ;

2 . MotionEvent 与 Pointer 触摸点关系 :

MotionEvent 对象中存储多个触摸点信息 , 每个触摸点都有 PointerId ( 触摸点标识 ) 和 PointerIndex ( 触摸点索引 ) 两个属性 ;

3 . PointerId 与 PointerIndex 运行机制 :

PointerId 触摸点 ID 标识 , 只要按下 , 不抬起 , 值不变 , 如果中间手指抬起 , 那么出现中间的 ID 空置的情况 ; 3 个手指按下 , PointerId 分别是 0, 1 , 2 ;中间的抬起 , 那么 PointerId 的 ID 值会空着 , 两个手指的 ID 分别是 0 和 2 ;

PointerIndex 触摸点索引值 , 3 个手指按下 , 索引值依次是 0 , 1 , 2 , 如果第二个手指抬起 , 后续的第三个的索引会由 2 变成 1 , 顺序补位替补上去 ;

III . 本次 PointerId 与 PointerIndex 获取


① 获取本次的触摸事件的 触摸点 ID :

//获取本事件对应的 pointerIndex
int actionIndex = event.getActionIndex();

② 获取本次触摸事件的 触摸点 索引 :

//4 . 获取 actionIndex 对应的 PointerId
int pointerId = event.getPointerId(actionIndex);

IV . PointerId 与 PointerIndex 互相转化


PointerId 与 PointerIndex 关联 及 转化关系 :

① 两者特点 : PointerId 是固定不变的 , PointerIndex 有顺序补位的特征 , 是不确定的 ;

② PointerId -> PointerIndex : 通过调用 MotionEvent 对象的 findPointerIndex(int pointerId) 方法可以获取指定 pointerId 对应的 PointerIndex 值 ;

③ PointerIndex -> PointerId : 通过调用 MotionEvent 对象的 getPointerId(int pointerIndex) 方法可以获取指定 PointerIndex 对应的 pointerId 值 ;

//3 . 获取 PointerId 对应的 PointerIndex
//      查找 ID值 对应的索引值
int pointerIndex = event.findPointerIndex(PointerId);
...
//      获取 索引值 对应的 ID 值
int PointerId = event.getPointerId(PointerIndex)

V . 触摸点个数获取 ( getPointerCount )


获取当前触摸点个数 :

//获取当前触摸点个数
int pointCount = event.getPointerCount();

VI . 触摸点坐标获取


获取触摸点坐标 :

① 获取当前触摸事件坐标 :

public final float getX()
public final float getY()

② 获取指定触摸点索引 PointerIndex 坐标 : ( 注意不是触摸点标识 )

public final float getX(int pointerIndex)
public final float getY(int pointerIndex)

//1 . 获取 坐标//1.1 获取 当前 触摸 事件的 x y 坐标
float x = event.getX();
float y = event.getY();//1.2 获取 指定 pointerIndex 的 x y 坐标 ( 获取第 0 个索引的坐标 )
int pointerIndex = 0;
float x_pointer = event.getX(pointerIndex);
float y_pointer = event.getY(pointerIndex);

VII . 多点触控 示例代码 ( 参考 )


package kim.hsl.multitouch;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onTouchEvent(MotionEvent event) {//多点触控示例/*1 . 多点触控事件 :多点触控事件 Action 由 pointerIndex 和 动作码 进行或运算 合成调用 event.getActionMasked() 即可获取动作码 , 屏蔽 pointerIndex 触摸索引2 . PointerId 和 PointerIndex :Pointer 就是触摸点 ;两个值的特点 :PointerId : 唯一性的表示一个触摸点 , 该值如果触摸上 , 任意移动 , 只要不抬起 , 就不变 ;PointerIndex : 触摸点的索引 , 是一个从 0 开始计数的连续的数值 , 同样是第 0 个索引 , 代表的可能是不同触摸点 ;运行机制 :PointerId : 只要按下 , 不抬起 , 值不变 , 如果中间手指抬起 , 那么出现中空的情况 ;3 个手指按下 , PointerId 分别是 1 , 2 , 3 ;中间的抬起 , 那么 PointerId 的 ID 值会空着 , 两个手指的 ID 分别是 1 和 3PointerIndex : 3 个手指按下 , 如果第二个手指抬起 , 后续的第三个的索引会由 2 变成 1 , 顺序补位替补上去PointerId 与 PointerIndex 转换换 :pointerId 是确定的 , PointerIndex 有顺序补位的特征 , 是不确定的通过 findPointerIndex(int pointerId) 方法可以获取指定 pointerId 的 PointerIndex 值3 . 获取坐标 :获取当前坐标 : event.getX();获取指定 pointerIndex 坐标 : event.getX(pointerIndex);4 . 多点触控的 5 种事件 :单点触控需要处理 ACTION_DOWN , ACTION_MOVE , ACTION_UP多点触控需要处理 ACTION_DOWN , ACTION_MOVE , ACTION_UP , ACTION_POINTER_DOWN , ACTION_POINTER_UP多点触控中这些动作有不同的含义 :ACTION_DOWN : 第一个手指按下ACTION_MOVE : 所有的手指滑动事件ACTION_UP : 最后一个手指抬起ACTION_POINTER_DOWN : 中间的手指按下 ( 已经有手指按下 )ACTION_POINTER_UP : 中间手指抬起 ( 还有手指在触摸中 )5 . 多点触控与单点触控对比多了两个事件 ACTION_POINTER_DOWN 和 ACTION_POINTER_UP多了触摸点 ID 标识与触摸点索引机制*///1 . 获取 坐标//1.1 获取 当前 触摸 事件的 x y 坐标float x = event.getX();float y = event.getY();//1.2 获取 指定 pointerIndex 的 x y 坐标 ( 获取第 0 个索引的坐标 )int pointerIndex = 0;float x_pointer = event.getX(pointerIndex);float y_pointer = event.getY(pointerIndex);//2 . 获取 触摸事件 相关属性//获取当前的多点触控触摸事件int actionMasked = event.getActionMasked();//获取本事件对应的 pointerIndexint actionIndex = event.getActionIndex();//获取当前触摸点个数int pointCount = event.getPointerCount();//3 . 获取 PointerId 对应的 PointerIndex//      查找第 1 个按下的手指的索引值pointerIndex = event.findPointerIndex(0);//4 . 处理对应的事件操作switch (actionMasked){case MotionEvent.ACTION_DOWN :          //第一个手指按下Log.i("TAG", "ACTION_DOWN : 第一个手指按下");break;case MotionEvent.ACTION_MOVE :          //手指移动Log.i("TAG", "ACTION_MOVE : 手指移动");break;case MotionEvent.ACTION_UP :            //最后一个手指抬起Log.i("TAG", "ACTION_UP : 最后一个手指抬起");break;case MotionEvent.ACTION_POINTER_DOWN :  //中间的手指按下 ( 已经有手指按下 )Log.i("TAG", "ACTION_POINTER_DOWN : 中间的手指按下 ( 已经有手指按下 )");break;case MotionEvent.ACTION_POINTER_UP :    //中间手指抬起 ( 还有手指在触摸中 )Log.i("TAG", "ACTION_POINTER_UP : 中间手指抬起 ( 还有手指在触摸中 )");break;}return true;}
}

【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )相关推荐

  1. 浅谈Android游戏开发基础和经验

    Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...

  2. Cocos Creator_实现策略_多点触控之触控管理器监听单例_TypeScript

    触控管理器(TypeScript实现) [主要功能] 1.实时访问每个触摸手指的状态(手指顺序,touch位置,按钮状态,Touch类) 2.使鼠标与触摸的API兼容访问 3.实时访问键盘按钮状态 4 ...

  3. Android游戏开发之单点触摸与多点触摸

    Android游戏开发之单点触摸与多点触摸的响应方式 游戏开发中的触摸事件 在游戏开发中监听屏幕触摸事件须要在View中重写父类onTouchEvent方法,在重写的方法中拦截用户触摸屏幕的一些信息, ...

  4. 【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)

    李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/450.html------- ...

  5. android 价格排序筛选页面,Android应用开发之基于Popupwindow实现的筛选房源信息等相关的可自由排序控件...

    本文将带你了解Android应用开发Android开发基于Popupwindow实现的筛选房源信息等相关的可自由排序控件,希望本文对大家学Android有所帮助. 功能 区分 支持区域二级选择     ...

  6. Android游戏开发系统控件-CheckBox

    Android游戏开发系统控件-CheckBox 2012/5/11 星期五 CheckBox是Android系统最普通的UI控件,继承了Button按钮 下面通过一个实例来学习 作者:wwj 功能: ...

  7. Android游戏开发系统控件-Dialog

    Android游戏开发系统控件-Dialog Dialog(对话框)在Android应用开发中经常用到,下面是学习<Android游戏编程从零开始>一书,关于Dialog的初步学习. 创建 ...

  8. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  9. Qt 触屏研究-部分控件实现滑屏效果

    上一篇博客是对手势操作的一些研究,这一篇主要是处理在触屏上实现控件类似手机的那种滑动效果.在网上查询资料可知qt有这样的属性. 现在我测试的两个控件是QTableWidget和QTextEdit两个比 ...

最新文章

  1. Android大图裁剪解决办法
  2. NRF52832与W25Q80通信
  3. 图形旋转的C语言源程序
  4. php获取excel时间,详细介绍PHPExcel读取Excel时间的示例代码
  5. IDEA中多行注释及取消注释的快捷键分享
  6. Redis工具之Jedis
  7. iOS https双向配置
  8. 一个热词推荐的简单实现
  9. java signutil_java.util包 上
  10. linepipe——又一个自然语言开源程序
  11. js获取数组中的最大值和最小值的方法汇总
  12. el-table的使用总结
  13. 计算机VFP试题答案,2010全国计算机vfp二级笔试试题及答案
  14. poi-tl——Word模板生成器
  15. 计算机的神奇小游戏,电脑课我们常玩的13个小游戏
  16. 最大销售额——01背包问题
  17. js监听手机横竖屏事件
  18. vs2019运行提示脚本错误
  19. 智能指针的标准之争:Boost vs. Loki (转)
  20. 域名服务器有什么作用?怎么查询域名服务器地址?

热门文章

  1. 06.系统编程-3.进程VS线程比较
  2. quartz定时定时任务执行两次
  3. linux 三大利器 grep sed awk sed
  4. 2008_10_28_星期二
  5. linux rm(remove) 命令详解
  6. SpringBoot框架(4)-- 类装配及Bean装配监听器
  7. 【CSS3】CSS中的定位
  8. getBoundingClientRect()方法
  9. FreeSwitch安装和配置记录
  10. Log4Net使用入门