运动事件描述了动作的动作代码和一些列的坐标值。动作代码表明了当触点按下或者弹起等引起的状态变化。坐标值描述了位置信息以及以他的运动属性。
例如,当用户第一次触摸屏幕的时候,系统给窗体发出一个触摸事件,动作代码为ACTION_DOWN,并提供了一些列的坐标值,比如触摸的X、Y坐标,接触区域的压力、尺寸、方向等信息。
一些设备能够在同一时间报告多条运动轨迹。多点触控屏幕为每个手指都发出一条运动轨迹。手指或者其他能够产生运动轨迹的物体都可以叫做触点。运动事件包含所有触点的信息,即使有些触点自从上次事件之后就没有再移动,这些触点必须是当前处于活动状态的。
只有触点按下或者抬起的时候才会影响触点的数量,只有动作取消的时候除外。
每个触点都有一个唯一的id,这个id是在触点第一次按下的时候(动作代码为ACTION_DOWN或者ACTION_POINTER_DOWN)由系统自动分配的。触点的id会一直保持有效,当触点抬起的时候(动作代码为ACTION_UP或者ACTION_POINTER_UP)或者动作取消(动作代码为ACTION_CANCEL)的时候会导致触点的id失效。
MotionEvent类提供了许多可以查看触点的位置或者其他信息的方式,比如getX(int)、getY(int)、getAxisValue(int)、getPointerId(int)、getToolType(int)。这其中的大部分方法都将触点的索引值作为参数而不是触点的id。在事件中,每个触点的索引号的取值范围是从0到getPointerCount()-1。
在一次运动中触点出现的顺序是不确定的。因此,触点的索引值会由于事件的变化而变化,但是只要触点处于活动状态,该触点的id就不会改变。用getPointerId(int)方法可以得到触点的id值,从而根据得到的id值在一连串的动作中来追踪其运动轨迹。然而在连续的运动事件中,应该用findPointerIndex(int)方法通过触点的id值得到触点的索引值。
为了提高效率,代码为ACTION_MOVE的运动事件可能会将多个运动路径处理成一个。最常用的当前触点的坐标可以通过getX(int)和getY(int)获得。之前的坐标可以通过getHistoricalX(int,int)和getHistoricalY(int,int)获得。这些坐标之所以被成为”历史坐标”是因为这些坐标比当前坐标更早的出现了。要想按照时间顺序处理所有坐标,首先要处理历史坐标,然后再是当前坐标。