多点触控笔记

一.多点触控的事件类型

单点触控可以用event.getAction() 获得触摸事件的类型:ACTION_DOWN、ACTION_UP、ACTION_MOVE
对于多点触控呢?

不能再用getAction获得事件类型,要通过getActionMask获得(getActionMask是通用的方法,也适用于单点触控),除了上面那三个事件,还有两个事件:

ACTION_POINTER_DOWN: 除第一个指针以外进入屏幕的其他指针。
ACTION_POINTER_UP: 除第一个指针以外退出屏幕的其他指针。

也就是说手指A,B:

A按下(DOWN)->B按下(POINTER_DOWN)->A抬起(POINTER_UP)->B抬起(UP)

ACTION_MOVE的事件在多点触控场景表现不变。

二.多点触控的区分

一个MotionEvent就可以包含多个手指的事件,区分主要依靠两个概念:
pointerID: 也就是手指的ID,按下到抬起都不会变。通过getPointerId(int index)获取
pointerIndex: 在这次事件里手指事件的索引,按下到抬起是可能会变的。

比如:手指A,B,C

都依次按下后:
id: 0,1,2
index: 0,1,2

如果中途手指B抬起,AC就变成:
id: 0,2
index: 0,1

三.多点触控事件的处理

假如getActionMask返回的是POINTER_DOWN或者POINTER_UP,代表这个MotionEvent里面有且只有一个手指是按下或者离开屏幕,可以通过getActionIndex拿到这个事件的索引去处理。

需要注意的是,一个MotionEvent里面也不可能同时出现POINTER_DOWN和POINTER_UP事件。

对个这个event中的剩下手指,都是MOVE事件,代表所有的手指都是在滑动,可以通过getX/Y(int pointerIndex)获取这个手指滑动的坐标。

四.正向处理容易,反向构建难。

手动构建MotionEvent的算法并不容易实现,在实践中,虽然能简单模仿多点触控,但是还有很多细节没有实现,除了上面说到的index,id,action等属性要处理,还要很多一些方法实现是不确定的,比如有getHistorical*(int index),获得历史坐标值等。

普通简单的游戏体验还好,但是像王者荣耀这样的大型游戏,操作比较复杂,对触控事件的精细度要求很高,不容易完全模拟,玩起来比较『涩』。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值