Android多点触控最佳实践

事故现场

  最近在对公司项目中的控件进行优化改造,其中一个是能够上拉和下拉的弹性ScrollView。


  发现没有,当使用一个手指的时候感觉还不错。但是当我想用两个手指交替不断下拉想要把视图内容往下“扒”的时候就办不到了,因为他在onTouchEvent()方法里只是最简单的实现了下拉的逻辑而没有涉及到多指触控,而我想要的效果是像QQ空间或者微信朋友圈那样的。

 

 


预备知识

为了将控件改造成能够支持多点触控的,首先我们需要了解Android中关于多点触控的基础知识。这里我推荐先阅读GcsSloop的两篇文章
安卓自定义View进阶-MotionEvent详解
安卓自定义View进阶-多点触控详解
  我现在假设你已经看了上面的那两篇文章,下面我来划重点:
1.多点触控时必须使用getActionMasked()来获取事件类型
2.Pointer:
MotionEvent中引入了Pointer的概念,一个pointer就代表一个触摸点,每个pointer都有自己的事件类型,也有自己的横轴坐标值。一个MotionEvent对象中可能会存储多个pointer的相关信息,每个pointer都会有一个自己的id和index。pointer的id在整个事件流中是不会发生变化的,但是index会发生变化
3.PointerId:
每根手指从按下、移动到离开屏幕,每个手指都会拥有一个固定PointerId.PointerId的值,一般用它来区分是哪根手指
4.PointerIndex:
每根手指从按下、移动到离开屏幕,每根手指在每一个事件的Index可能是不固定的,因为受到其它手指的影响
5.PointerId和PointerIndex的变化规律
关于变化规律这里,可以看GcsSloop的第二篇文章,这里我不再赘述,只举一个实际的例子:

事件 PointerId PointerIndex
依次按下三根手指 三根手指的id依次为0、1、2 三根手指的index依次为0、1、2
抬起第二根手指 第一根手指的id为0,第三根手指的id为2 第一根手指的index为0,第三根手指的index变为1
抬起第一根手指 第三根手指的id为2 第三根手指的index变为0

可见同一根手指的id是不会变化的,而index是会变化的,但总是以0、1或者0、1、2这样的形式出现,而不可能出现0、2这样间隔了一个的或者1、2这样的没有0索引在内的形式

6.多点触控相关事件

事件 简介
ACTION_DOWN 第一个手指初次接触到屏幕时触发
ACTION_MOVE 手指在屏幕上滑动时触发,会多次触发。
ACTION_UP 最后一个手指离开屏幕时触发
ACTION_POINTER_DOWN 有非主要的手指按下(即按下之前已经有手指在屏幕上)
ACTION_POINTER_UP 有非主要的手指抬起(即抬起之后仍然有手指在屏幕上)

7.多点触控相关的方法:

方法 简介
getActionMasked() 与 getAction() 类似,多点触控需要使用这个方法获取事件类型
getActionIndex()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值