一、简单手势识别:

简单手势识别分为以下几个步骤:

1.手指触碰屏幕时,触发MotionEvent事件;

2.该事件被OnTouchListener监听,可在它的onTouch()方法中获得该MotionEvent对象;

3.通过GestureDetector转发MotionEvent对象给OnGestureListener;

4.我们可以通过OnGestureListener获得该对象,然后获取相关信息,以及做相关处理。

MotionEvent中封装了手势动作事件和x、y坐标信息。

GestureDetector对手势进行加工,交给GestureListener进行处理。

GestureDetector提供了OnDoubleTapListener、OnGestureListener两种监听器,同时提供了SimpleOnGestureListener类进行适配,让我们选择需要的接口进行实现。

我们主要的工作就在步骤4,在GestureListener中对用户的手势操作进行分析和处理。

GestureListener有以下回调接口:

onDown: 按下,只要手指触碰即触发。

onFling: 快速滑动并松开。

onLongPress: 长按。

onScroll: 滑动。

onShowPress: 短按。

onSingleTapUp:抬起。

OnDoubleTapListener有以下接口:

onSingleTapConfirmed :单击。

onDoubleTap :双击

onDoubleTapEvent:双击中的第二次按下后事件触发。

下面是简单的测试代码:

public class MainActivity extends AppCompatActivity {

    private ImageView iv;
private GestureDetector gestureDetector; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gestureDetector=new GestureDetector(this,new MyGestureLsn());
iv= (ImageView) findViewById(R.id.iv);
iv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
return true;
}
}); } class MyGestureLsn extends GestureDetector.SimpleOnGestureListener{ @Override
public boolean onSingleTapUp(MotionEvent e) {
Show.log("onSingleTapUp");
return super.onSingleTapUp(e);
} @Override
public void onLongPress(MotionEvent e) {
Show.log("onLongPress");
super.onLongPress(e);
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Show.log("onScroll");
return super.onScroll(e1, e2, distanceX, distanceY);
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Show.log("onFling");
return super.onFling(e1, e2, velocityX, velocityY);
} @Override
public void onShowPress(MotionEvent e) {
Show.log("onShowPress");
super.onShowPress(e);
} @Override
public boolean onDown(MotionEvent e) {
Show.log("onDown");
return super.onDown(e);
} @Override
public boolean onDoubleTap(MotionEvent e) {
Show.log("onDoubleTap");
return super.onDoubleTap(e);
} @Override
public boolean onDoubleTapEvent(MotionEvent e) {
Show.log("onDoubleTapEvent");
return super.onDoubleTapEvent(e);
} @Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Show.log("onSingleTapConfirmed");
return super.onSingleTapConfirmed(e);
}
}
}

二、复杂手势识别

1.生成手势库文件

android提供了GestureOverlayView类用于复杂手势的识别,首先得创建手势库文件,建议用谷歌提供的一个工具——GestureBuilder项目来生成,

当然也可以自己创建一个项目来生成,下面是一段创建手势库的简单代码:

        GestureOverlayView gesture = (GestureOverlayView) findViewById(R.id.gesture);
gesture.setGestureColor(Color.GREEN);
gesture.setGestureStrokeWidth(5);
gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
@Override
public void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {
View saveDialog = getLayoutInflater().inflate(R.layout.dialog_save, null, false);
ImageView img_show = (ImageView) saveDialog.findViewById(R.id.img_show);
Bitmap bitmap = gesture.toBitmap(128, 128, 10, 0xffff0000);
img_show.setImageBitmap(bitmap);
new AlertDialog.Builder(MainActivity.this).setView(saveDialog)
.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//获取文件对应的手势库
GestureLibrary gestureLib = GestureLibraries.fromFile("/mnt/sdcard/gestures");
gestureLib.addGesture("gesture name", gesture);
gestureLib.save();
}
}).setNegativeButton("取消", null).show();
}
});

每个手势都对应一个名字,为了防止识别错误,最好让各个手势之间的差别足够大。

2.识别

首先得将手势库文件导入到项目中,然后在将新手势和手势库中的进行匹配:

        GestureLibrary gestureLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
if (gestureLibrary.load()) {
//加载成功
} else {
//加载失败
} GestureOverlayView gesture = (GestureOverlayView) findViewById(R.id.gesture);
gesture.setGestureColor(Color.GREEN);
gesture.setGestureStrokeWidth(5);
gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
@Override
public void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {
//识别用户刚绘制的手势
ArrayList<Prediction> predictions = gestureLibrary.recognize(gesture);
ArrayList<String> result = new ArrayList<String>();
//遍历所有找到的Prediction对象
for (Prediction pred : predictions) {
if (pred.score > 1.0) {
result.add("与手势【" + pred.name + "】相似度为" + pred.score);
}
}
if (result.size() > 0) {
ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(MainActivity.this,
android.R.layout.simple_dropdown_item_1line, result.toArray());
new AlertDialog.Builder(MainActivity.this).setAdapter(adapter, null).setPositiveButton("确定", null).show();
} else {
Toast.makeText(MainActivity.this, "无法找到匹配的手势!", Toast.LENGTH_SHORT).show();
}
}
});

android手势识别的更多相关文章

  1. Android手势识别的发展

    在播放器.与手势识别.所以,看看今天的我们Android手势识别. 首先,我们需要站在巨人的肩膀上.有些人举了个例子和说明. 第一章: http://www.2cto.com/kf/201110/10 ...

  2. 札记:android手势识别,MotionEvent

    摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势T ...

  3. Android手势识别(单击 双击 抬起 短按 长按 滚动 滑动)

    对于触摸屏,其原生的消息无非按下.抬起.移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理.不过,为了提高我们的APP的用户体验,有时候我们 ...

  4. Android手势识别总结

    一:首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouc ...

  5. android手势识别ViewFlipper触摸动画

    使用ViewFlipper来将您要来回拖动的View装在一起,然 后与GestureDetector手势识别类来联动,确定要显示哪个View,加上一点点动画效果即可.比如当手指向左快速滑动时跳转到上一 ...

  6. Android 手势识别—缩放

    上一篇讲解了手势识别中的点击和双击事件的识别,用到的是GestureDetector类和GestureDetectorCompat类,用于监听用户触摸屏幕中的简单动作. 缩放 基本用法如下,可以通过缩 ...

  7. Android 手势识别——单击/双击

    为什么需要手势识别? 手势对于我们的app有很多的地方都在使用,比如右滑关闭界面等.手势控制分为触发动作(Touch Mechanics,用户手指在屏幕上如何动作)和触发行为(Touch Activi ...

  8. Android+手势识别详解

      今天就来把以前的学习文章与经验简单总结中出来吧,在这里我就直接把代码贴下来了,希望能给初学者做最佳的学习参考,也希望有更多的开发人员来加入 ANDROID开发团队,参与更多的创新方式的开发,好了, ...

  9. 【转】android 手势识别和VelocityTracker

    参考地址: http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html http://www.jcodecraeer.co ...

随机推荐

  1. This is my first blog----文件操作基本流程

    一,文件操作基本流程. 计算机系统分为: 计算机硬件, 操作系统, 应用程序三部分 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件 ...

  2. css3中的渐变效果

    大家好,这里是demo软件园,今天为大家分享的是css3中的渐变效果. css3中的渐变需要注意的是渐变的是图片而不是颜色,而渐变又分为两种:线性渐变与径向渐变,今天我们重点介绍的是线性渐变. 1.线 ...

  3. python之routes入门

    一.入门 from routes import Mapper map = Mapper() # 创建一个mapper()路由实例对象 # connect注册路由信息 # 路由名称'zbj', 路径是 ...

  4. P1303_A*B Problem(JAVA语言)

    思路:BigInteger 三杀! //四行搞定 题目描述 求两数的积. 输入输出格式 输入格式: 两行,两个数. 输出格式: 积 输入输出样例 输入样例#1: 复制 1 2 输出样例#1: 复制 2 ...

  5. Vue组件(35)动态组件 component 的 is 到底可以是啥?

    component 动态组件 Vue官网上提供了一个动态组件 <component :is="currentTabComponent"> ,那么这里的 is 到底是什么 ...

  6. python基础(十):集合的使用(上)

    集合的作用 去重:把一个列表变成集合,就自动去重了. 关系测试:测试两组数据之前的交集.差集.并集等关系. 集合的特征 集合使用 set 表示: 集合也使用{ }表示, 与字典不同的是:字典中存储的是 ...

  7. C/C++中的const

    1 C中的const C中const修饰的变量是只读变量,在使用const关键字声明定义变量时会给该变量分配内存空间. const修饰的全局变量默认是外部链接的,即其它源文件可以直接使用该变量. co ...

  8. C程序数组算法 — 冒泡法排序【前冒 || 后冒】

    第一种写法(前冒泡): /* C程序数组算法 - 冒泡法排序 * 此例子按照 大 -> 小 排序 * 原理:两两相比较,然后进行大小对调 * 比较次数: n^2 次 * 说明:冒泡排序是相对稳定 ...

  9. 无法Ping通阿里云服务器的公网IP地址的解决方法

    解决步骤: 1.打开控制台2.打开防火墙3.添加规则添加规则的详情页,可以添加全部TCP也可以自定义添加一定端口范围的TCP:

  10. TP6学习笔记一:安装与基本配置

    1 说明与概述 1.1 说明 以下内容大部分来源于TP6完全开发手册,以手册为主附上个人理解,仅作学习使用. 1.2 概述 第一篇学习笔记,主要记录TP6的基础,包括TP6简介,安装,Hello Wo ...