手势识别是我们日常使用电子物品中非常常见的一个功能,这个功能大大提升了用户体验的感受

    手势识别主要有两种方法,一种是GestureDetector,另一种是GestureOverlayView

现在来研究下GestureDetector方法

    1.手指触屏的一瞬间,触发MotionEvent事件

    2.被OnTouchListener监听,在onTouch()中获得MotionEvent对象

    3.GestureDetector转发MotionEvent对象至OnGestureListener

    4.OngestureListener获得该对象,根据该对象封装的信息做出合适的反馈

MotionEvent:

  1. 用于封装手势、触摸笔、轨迹球等动作事件

    内部封装用于记录横轴和纵轴坐标的属性X和Y  

    手势的滑动相当于屏幕上的XY轴的坐标的变化

GestureDetector:识别各种手势

当手指:按下、移动、抬起等可通过重载onTouch或者设置setOnTouchListener来监听

原理:当接收到用户触摸消息时,将消息交给GestureDetector加工,通过设置监听器获得GestureDetector处理后的手势


OnGestureListener:手势交互的监听接口,其提供多个抽象方法、根据GestureDetector的手势识别结果调用相对应的方法 ,监听单击事件

OnDoubleTapListener:监听双击事件


OnGestureListener接口的方法太多,没有办法写完,所以只需写一个类,实现所需要的方法即可

单击:onDown、抬起:onSingleTapUp、短按:onShowPress、长按:onLongPress、滚动:onScroll、滑动:onFling

Android提供了一个类SimpleOnGestureListener:我们只需继承这个类,然后重载感兴趣的手势就行


例子代码如下:

package com.gdut.gesturedetector;


import android.app.Activity;

import android.app.ActionBar;

import android.app.Fragment;

import android.os.Bundle;

import android.view.GestureDetector;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.MenuItem;

import android.view.MotionEvent;

import android.view.View;

import android.view.GestureDetector.SimpleOnGestureListener;

import android.view.View.OnTouchListener;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.Toast;

import android.os.Build;


public class MainActivity extends Activity {

private ImageView img;

private GestureDetector myGestureDetector;

//OnGestureListener接口的方法太多,没有办法写完,所以只需写一个类,实现所需要的方法即可

//android提供了一个类simpleOnGestureListener

class myGestureListener extends SimpleOnGestureListener{

//实现滑动的onFling方法

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

if(e1.getX() - e2.getX() > 50){

Toast.makeText(MainActivity.this, "从右往左滑动!", Toast.LENGTH_SHORT).show();

}else if(e2.getX() - e1.getX() > 50){

Toast.makeText(MainActivity.this, "从左往右滑动!", Toast.LENGTH_SHORT).show();

}

return super.onFling(e1, e2, velocityX, velocityY);

}

}


@SuppressWarnings("deprecation")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

img = (ImageView) findViewById(R.id.img);

//实例化myGestureDetector,并监听

myGestureDetector = new GestureDetector(new myGestureListener());

//向对这张图片进行监听

img.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

//获得的event要通过GestureDetector转发出去给OnGestureListener,OnGestureListener获得该对象,根据该对象封装的信息作出合适的反馈

myGestureDetector.onTouchEvent(event);

return true;

}

});

}


}


但是GestureDetector,有局限,就是只能进行比较少而简单的手势操作。

而比较复杂或者自定义的手势,就由GestureOverlayView实现