手势识别是我们日常使用电子物品中非常常见的一个功能,这个功能大大提升了用户体验的感受
手势识别主要有两种方法,一种是GestureDetector,另一种是GestureOverlayView
现在来研究下GestureDetector方法
1.手指触屏的一瞬间,触发MotionEvent事件
2.被OnTouchListener监听,在onTouch()中获得MotionEvent对象
3.GestureDetector转发MotionEvent对象至OnGestureListener
4.OngestureListener获得该对象,根据该对象封装的信息做出合适的反馈
MotionEvent:
用于封装手势、触摸笔、轨迹球等动作事件
内部封装用于记录横轴和纵轴坐标的属性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实现
本文出自 “11828641” 博客,请务必保留此出处http://11838641.blog.51cto.com/11828641/1839703
原文地址:http://11838641.blog.51cto.com/11828641/1839703