Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

Android游戏开发之旅(十一)View中手势识别

Posted on 2010-12-03 10:25 啥都写点 阅读(675) 评论(0)  编辑  收藏 所属分类: Android

有关Android平台 的游戏 开发 中我们需要涉及到控制,在开始的Android游戏开发之旅 中我们提到了按键和轨迹球的控制方式,从今天开始 Android123开始给出大家游戏中其他的一些控制方式,比如今天的手势操作和未来重力感应。

很多网友发现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 等更高层的界面 中实现触控。

view plaincopy to clipboardprint?
class CwjView extends View {  
    private GestureDetector mGD;  
    public CwjView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
      
        mGD = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {  
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {  
                    int dx = (int) (e2.getX() - e1.getX()); //计算滑动的距离  
                    if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) { //降噪处理,必须有较大的动作才识别  
                        if (velocityX > 0) {  
                          //向右边  
                        } else {  
                            //向左边  
                        }  
                        return true;  
                    } else {  
                        return false;  //当然可以处理velocityY处理向上和向下的动作  
                    }  
                }  
            });  
    } 
class CwjView extends View {
    private GestureDetector mGD;
    public CwjView(Context context, AttributeSet attrs) {
        super(context, attrs);
   
        mGD = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                    int dx = (int) (e2.getX() - e1.getX()); //计算滑动的距离
                    if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) { //降噪处理,必须有较大的动作才识别
                        if (velocityX > 0) {
                          //向右边
                        } else {
                            //向左边
                        }
                        return true;
                    } else {
                        return false;  //当然可以处理velocityY处理向上和向下的动作
                    }
                }
            });
    }

在上面Android123提示大家仅仅探测了Fling动作仅仅实现了onFling方法,这里相关的还有以下几种方法来实现具体的可以参考我们以前的文章有详细的解释:

view plaincopy to clipboardprint?
   
boolean  onDoubleTap(MotionEvent e)  
boolean  onDoubleTapEvent(MotionEvent e)   
boolean  onDown(MotionEvent e)   
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)  
 
boolean  onDoubleTap(MotionEvent e)
boolean  onDoubleTapEvent(MotionEvent e)
boolean  onDown(MotionEvent e)
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) 

接下来是重点,让我们的View接受触控,需要使用下面两个方法让GestureDetector类去处理onTouchEvent和 onInterceptTouchEvent方法。

view plaincopy to clipboardprint?
@Override 
public boolean onTouchEvent(MotionEvent event) {   
    mGD.onTouchEvent(event);  
    return true;  
}  
@Override 
public boolean onInterceptTouchEvent(MotionEvent event) {  
    return mGD.onTouchEvent(event);  
}  

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034582.aspx



                                                                                                       --    学海无涯