我们在进行Android游戏开发时会用到很多种控制,包括前面讲到的按键和轨迹球控制方式,除此之外还有手势操作、重力感应等多种控制方式需要了解掌握。本节主要为大家讲解在View中如何进行手势识别。

       很多网友发现Android中手势识别提供了两个类,由于Android 1.6以下的版本比如cupcake中无法使用android.view.GestureDetector,而android.gesture.Gesture是Android 1.6开始支持的,考虑到仍然有使用Android 1.5固件的网友,就来看下兼容性更强的android.view.GestureDetector。在android.view.GestureDetector类中有很多种重载版本,下面我们仅提到能够自定义在View中的两种方法,分别为GestureDetector(Context context, GestureDetector.OnGestureListener listener) 和GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler) 。我们可以看到第一个参数为Context,所以我们想附着到某View时,最简单的方法就是直接从超类派生传递Context,实现GestureDetector里中提供一些接口。

       下面我们就以实现手势识别的onFling动作,在CwjView中我们从View类继承,当然大家可以从TextView等更高层的界面中实现触控。

Java代码
  1. class CwjView extends View {   
  2.   
  3.     private GestureDetector mGD;   
  4.     public CwjView(Context context, AttributeSet attrs) {   
  5.         super(context, attrs);   
  6.          
  7.         mGD = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {   
  8.                 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {   
  9.                     int dx = (int) (e2.getX() - e1.getX()); //计算滑动的距离   
  10.   
  11.                     if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) { //降噪处理,必须有较大的动作才识别   
  12.                         if (velocityX > 0) {   
  13.                            //向右边   
  14.   
  15.                         } else {   
  16.                             //向左边   
  17.   
  18.                         }   
  19.                         return true;   
  20.                     } else {   
  21.                         return false;  //当然可以处理velocityY处理向上和向下的动作   
  22.                     }   
  23.                 }   
  24.             });   
  25.     }   
  26.   
  27.   /*提示大家上面仅仅探测了Fling动作仅仅实现了onFling方法,这里相关的还有以下几种方法来实现具体的可以参考我们以前的文章有详细的解释:  
  28.  
  29.  boolean  onDoubleTap(MotionEvent e)   
  30.  boolean  onDoubleTapEvent(MotionEvent e)   
  31.  boolean  onDown(MotionEvent e)   
  32.  void  onLongPress(MotionEvent e)   
  33.  boolean  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)   
  34.  void  onShowPress(MotionEvent e)   
  35.  boolean  onSingleTapConfirmed(MotionEvent e)   
  36.  boolean  onSingleTapUp(MotionEvent e)   
  37.  */  
  38.   
  39.    //接下来是重点,让我们的View接受触控,需要使用下面两个方法让GestureDetector类去处理onTouchEvent和onInterceptTouchEvent方法。   
  40.   
  41.     @Override  
  42.     public boolean onTouchEvent(MotionEvent event) {     
  43.         mGD.onTouchEvent(event);   
  44.         return true;   
  45.     }   
  46.   
  47.     @Override  
  48.     public boolean onInterceptTouchEvent(MotionEvent event) {   
  49.         return mGD.onTouchEvent(event);   
  50.     }   
  51.   
  52. }  

       本节关于View中手势识别的内容就讲这些。大家知道,很多Android设备都提供了重力感应器和加速度感应器,而稍好些的设备还具备陀螺仪感应器,提供测试角速度功能。下一节将为大家讲解重力感应知识。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/game/97.html
2012年7月3日
发布:鸡啄米 分类:Android游戏开发 浏览: 评论:0