Android的多点触控,实则上就是对MotionEvent的更多处理。在Android平台上,触屏事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN,而移动操作时为 ACTION_MOVE,最终放开手指时触发ACTION_UP事件,而用户无规则的操作则可能触发ACTION_CANCEL这个动作。另外需要注意的是:Android的多点触控功能需要在Android 2.0版本以上才能支持。
具体上,关于多点触控有几个对MotionEvent的常用函数:
event.getAction(); //获取触控动作比如ACTION_DOWN
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的
event.getDownTime(); //按下开始时间
event.getEventTime(); //事件结束时间
event.getEventTime()-event.getDownTime()); //总共按下时花费时间
另外需要说明的是,有两个参数可以用来获取对触摸的控制,这两个参数分别为:MotionEvent.getAction()和MotionEvent.ACTION_MASK,前者用于对单点触控进行操作,后者用于对多点触控进行操作。对于单点触控,由MotionEvent.getAction()可以得到以下几种事件:ACTION_DOWN、ACTION_UP,而对于多点触控,由MotionEvent.ACTION_MASK,我们可以得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP,都是MotionEvent中的常量,可以直接调用,比如MotionEvent.ACTION_POINTER_1_DOWN,MotionEvent.ACTION_POINTER_2_UP。而有些常量则是单点和多点共用的,如:ACTION_MOVE,因此在按下时,必须标记单点与多点触控的区别。
补充:Android2.2(API8)中onTouchEvent(MotionEvent event) 这里可以用event.getActionMasked()表示用于多点触控检测点。而在Android1.6和Android 2.1中并没有event.getActionMasked()这个方法,不过这其实也就是把event.getAction()和 MotionEvent.ACTION_MASK封装了一下而已。而问题是,谷歌为什么要费劲这样做。
在API 8之前,对于单点触控和多点触控的区分,使用前面列出的函数就足够了。通常的流程是:首先使用getPointerCount来获取当前存在多少触摸点,以确认这里面存在了所有你需要使用到的触摸点;然后对感兴趣的触摸点,让nID(从0开始)作为参数,通过getX和getY这两个方法来获取位置;再加上MotionEvent.ACTION_#_1_DOWN和MotionEvent.ACTION_#_1_UP(其中的#是指nID+1)来确认操作为按下还是抬起;最后就是去响应相关的操作了。
这一切看起来都没什么问题的,实际上也的确是没有任何问题的。所以,如果你只关心程序的正确性,你就不必往下看了。但如果你是一个偏执狂,不希望使用API 8进行如上操作时会出现Warning,那么你就可以继续往下看了。下面就是针对怎样解决这个warning而写的,不过要先普及一些知识:
在Android中,对于MotionEvent中的每一个值,都是一个int值,而MotionEvent已经规定了很多常用的常量。(未完待续)