Android多点触摸与手势

4.1.2 Android多点触摸与手势

单点触摸不能完成缩放、滑动等动作,这就需要多点触摸与手势的支持。

1)多点触摸

Android从2.0版本开始支持多点触摸,在API中体现出来就是一个MotionEvent事件里面包含若干个点的信息。因为不同硬件支持的点数不一样,所以需要通过API获取得到的点的个数。下面是一个SDK文档中的例子,并做了简单的注释:

  
  
  1. void printSamples(MotionEvent ev) {  
  2. final int historySize = ev.getHistorySize();
     // 获取历史采样的集合大小  
  3. final int pointerCount = ev.getPointerCount();
     // 获取事件点数  
  4. for (int h = 0; h < historySize; h++) { // 对历史采样进行记录  
  5. // 历史采样的时间点  
  6. System.out.printf("At time %d:", ev.
    getHistoricalEventTime(h));  
  7. for (int p = 0; p < pointerCount; p++) { //   
  8. System.out.printf(" pointer %d: (%f,%f)",  
  9. ev.getPointerId(p), ev.
    getHistoricalX(p, h), ev.getHistoricalY(p, h));
     // 打印每个点的坐标  
  10. }  
  11. }  
  12. // 处理当前的点,输出时间以及每个点的坐标  
  13. System.out.printf("At time %d:", ev.getEventTime());  
  14. for (int p = 0; p < pointerCount; p++) {  
  15. System.out.printf(" pointer %d: (%f,%f)",  
  16. ev.getPointerId(p), ev.getX(p), ev.getY(p));  
  17. }  
  18.  }  

2)手势

手势是用户输入的某个或者某系列参数动作,比如按下、上拉、下拉、划圈等。通过对onTouch(MotionEvent)方法里面的MotionEvent进行一段时间的采样并且进行模式检测,即可得到手势。具体的手势检测算法,对于某些应用来说可能是独特的,但是对于常用的软件,使用到的手势一般只有某个方向的滑动、快速滑动、按下、长按等,若是这类常规需求,可以考虑使用Android提供的GestureDetector类进行手势检测。

“GestureDetector”检测手势的输入源是MotionEvent,为了能够把MotionEvent输入到GestureDetector里面进行检测,需实现”GestureDetector.OnGestureListener”接口,一般在Activity里面实现。如果没有特殊要求,按照SDK的推荐,实现一个子接口”GestureDetector.SimpleOn GestureListener”,它有如下一些手势事件:

boolean onDoubleTap(MotionEvent e)–双击。

boolean onDoubleTapEvent(MotionEvent e)–双击按下和弹起都触发,通过e.getAction()判断按下或者弹起。

boolean onDown(MotionEvent e)–按下。

boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)–滑动,其中后两个参数是X轴和Y轴的速度,在弹起的时候触发。

void onLongPress(MotionEvent e)–长按,按住的时候触发。

boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)–滑动,滑动过程中触发。

void onShowPress(MotionEvent e)–若按下较长时间未滑动,则触发该事件。

boolean onSingleTapConfirmed(MotionEvent e)–如果只有按下事件而后面不带滑动事件,就触发该事件。

boolean onSingleTapUp(MotionEvent e)–按下并且弹起的时候触发。

创建GestureDetector,把onTouch得到的MotionEvent交由GestureDetector.onTouchEvent(event)处理。示例代码如下:

  
  
  1. public boolean onTouch(View view, MotionEvent event) {  
  2. return mGestureDetector.onTouchEvent(event);  
  3. }  

屏幕单击、长按、滑动、键盘单击等只不过是一些离散的输入信号,它们被组织成各种事件、手势的过程,有潜在的相互影响,比如在一个事件被当做长按处理以后,便不会产生单击事件,这一点从上面的小程序中的返回值可以看出,如图4-2所示。

 
图4-2
第一次长按的处理函数中,返回了”true”,结果监听器就监听不到单击事件,而第二次长按处理函数中返回了”false”,接着就发生了一次单击事件。所以当程序需要进行很复杂的输入事件、手势处理的时候,需要仔细研究一下它们产生的顺序以及相互之间的影响。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值