官方文档:https://developer.android.google.cn/reference/android/view/MotionEvent.html#ACTION_MASK
首先要清楚事件分发机制,在一次事件序列(从按下到抬起)中会产生若干个MotionEvent,首先会调用onTouch(setOnTouchListener)进行处理,如果返回false的话说明没有消耗,交给onTouchEvent处理,另外click是基于onTouchEvent的,所以也是排在onTouch之后。
屏幕是支持多点触控的,每一个放上的手指(pointer)都会获得一个标识Id,这个id在整个时间序列中是不变的。另外,对于每一个MotionEvent,每一个pointer还有一个Index,这个序号是没有规律的,不和Id对应,也不保证不变。event取Pointer各种信息用的都是index,可以通过event.getPointerId(int index)把id和index对应起来,找到你想要的指定pointer的信息。
手势监测:所谓的手势监测就是对MotionEvent的各种参数进行处理分析,来得出例如旋转缩放等结论。实际上,官方类库提供了一些用来分析事件的类,如:GestureDetector,ScaleGestureDetector。这两个类使用方式一样,在构造器中传入context和对应的回调接口实例化。然后将MotionEvent传给他们的onTouchEvent进行处理,处理后会调用回调接口返回结果。
以缩放手势监测为例:
public interface OnScaleGestureListener {
boolean onScale(ScaleGestureDetector var1);
boolean onScaleBegin(ScaleGestureDetector var1);
void onScaleEnd(ScaleGestureDetector var1);
}
ScaleGestureDetector在onTouchEvent中判断为缩放后会调用onScale,然后可以通过var1.getScaleFactor获取缩放比例。
另外也可以自定义手势监测工具类,比如旋转手势监测,储存上一次的事件,然后比较两个事件中两个手指的点的位置,经过计算就可以得出旋转角度。只用到了event的位置信息,应该还是比较简单的。