Android手势识别入门
来源:互联网 发布:mysql中的主键是什么 编辑:程序博客网 时间:2024/05/16 11:12
1. 建立手势库
使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows/samples/android-8/GestureBuilder)。
使用GestureBuilder之前,你需要恢复其到开发环境,然后进行编绎并部署到手机上。
此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestures
具体步骤:
1. 新建一个 Android 项目,项目名称为 GestureBuilder
2. 进入到 android-sdk-windows/samples/
进入到对应的版本 SDK 目录,因为我使用的是 Android2.2。
于是再进入到 android-8 目录下,打开 GestureBuilder 项目
3. 选中 GestureBuilder 项目的 graphics、res、src 文件夹 和 AndroidManifest.xml 文件,复制它们
4. 再进入到我们自己新建的 GestureBuilder 下,删掉自己的 graphics、res、src 文件夹 和AndroidManifest.xml 文件
再将复制的内容粘贴到文件夹下。昨晚这些项目,就相当于将 Android的 例子程序 GestureBuilder 导入进了 eclipse 环境中
5. 然后再将项目部属到模拟器上。出现一个添加手势库的程序。
6. 点击 "Add gesture",就可以添加一个手势。
在屏幕上画出一个图形,再在屏幕上方为这个图形输入一个名字。就完成了一个手势的添加。如图:
图一:绘图
图二:主界面,点击 "Add gesture" 和可进入到绘图界面
7. 点击 "Done" 按钮可以保存这个手势到手势库文件
8. 所有添加的手势都被保存到了 SD 卡根目录下的 gestures 手势库文件中。
我添加了两个手势:一个 "勾" 形图形,名称为 "close" ; 一个 "W",名称为 "wjh"。
在接下来的示例应用中,将用到这两个手势。当在应用中,画出 "勾" 形手势时,将关闭应用。当画出 "W" 手势时,将拨打 wjh 的电话号码。
2. 新建 Android 项目: Gesture
将生成的手势文件导出来,并放置在 Gesture 应用中。
为了便于查找和使用,在 Gesture 应用的 res 目录下再新建一个 raw 目录,将手势库文件放置在此目录下面。如图:
3. 界面设计,提供一个场地,使用户可以在此控件上可以画手势
使用 android.gesture.GestureOverlayView 控件
<android.gesture.GestureOverlayView
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0" />
4. 当一个手势画完毕后,会触发一个事件
GestureOverlayView.addOnGesturePerformedListener(OnGesturePerformedListener listener)
将用户一个手势画完后,就会调用 OnGesturePerformedListener 的 onGesturePerformed 方法。因此我们适合关注此方法,对手势进行识别。
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture);
5. 加载手势库
GestureLibrary library = GestureLibraries.fromRawResource(this, R.raw.gestures);
library.load();
6. 取出匹配集合
/* 查找手势库中与用户画的手势库有些相似性的手势集合
* 并按照相似性度高到低排序,与用户画的图形最相似的手势,放在集合第一个位置 */
ArrayList<Prediction> predictions = library.recognize(gesture);
7. 单手势识别 Activity 代码清单:
package com.kelly.gesturedemo;import java.util.ArrayList;import android.app.Activity;import android.content.Intent;import android.gesture.Gesture;import android.gesture.GestureLibraries;import android.gesture.GestureLibrary;import android.gesture.GestureOverlayView;import android.gesture.GestureOverlayView.OnGestureListener;import android.gesture.GestureOverlayView.OnGesturePerformedListener;import android.gesture.Prediction;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "MainActivity";private GestureOverlayView overlayView = null;private Gesture mGesture;GestureLibrary library;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);library = GestureLibraries.fromRawResource(this, R.raw.gestures);// 得到手势库library.load();// 加载overlayView = (GestureOverlayView) findViewById(R.id.gestures);// 此方法只针对单笔手势overlayView.addOnGesturePerformedListener(new GesturePerformedListener());// 监听单笔 多笔overlayView.addOnGestureListener(new GestureListener());}private final class GestureListener implements OnGestureListener {@Overridepublic void onGestureStarted(GestureOverlayView overlay,MotionEvent event) {Log.i(TAG, "onGestureStarted");}@Overridepublic void onGesture(GestureOverlayView overlay, MotionEvent event) {Log.i(TAG, "onGesture");}@Overridepublic void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {Log.i(TAG, "onGestureEnded");// 获取最后的手势mGesture = overlay.getGesture();}@Overridepublic void onGestureCancelled(GestureOverlayView overlay,MotionEvent event) {Log.i(TAG, "onGestureCancelled");}}/** * 单笔手势 * * @author Administrator * */private final class GesturePerformedListener implementsOnGesturePerformedListener {public void onGesturePerformed(GestureOverlayView overlay,Gesture gesture) {recognize(gesture);}}private void recognize(Gesture gesture) {ArrayList<Prediction> predictions = library.recognize(gesture);if (!predictions.isEmpty()) {Prediction prediction = predictions.get(0);double score = prediction.score;if (score >= 6) {if (prediction.name.equals("张凯")) {Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:10086"));startActivity(intent);} else if ("close".equals(prediction.name)) {finish();// 关闭Activity}} else {Toast.makeText(getApplicationContext(), "匹配度too low", 1).show();}} else {Toast.makeText(MainActivity.this, "没有发现匹配的手势", 1).show();}}@Overrideprotected void onDestroy() {super.onDestroy();android.os.Process.killProcess(android.os.Process.myPid());// 关闭应用}public void find(View view) {recognize(mGesture);overlayView.clear(true);}}
原文:http://blog.163.com/gpf1987@126/blog/static/140401677201212921237657/
- Android手势识别入门
- Android-自定义手势识别-复杂手势识别
- Android+手势识别详解
- android手势Gesture识别
- android之手势识别
- Android 多点手势识别
- Android触摸屏手势识别
- android基础--手势识别
- android手势识别实例
- Android GestureDetector手势识别
- Android 多点手势识别
- Android 手势识别
- android之手势识别
- Android手势识别
- android之手势识别
- android---手势识别
- Android手势识别
- android识别手势
- org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be re
- 终止进程
- GNU Guix 0.8 发布,软件包管理器
- javascript switch default写在case前
- Top Ten Reasons not to use the C shell
- Android手势识别入门
- strcpy函数的实现
- 蓝桥杯,入门训练,圆的面积
- linux shell 加法运算,字符串split
- 股票选股公式汇总
- 单相半波可控整流电路 Single Phase Half Wave Controlled Rectifier
- uva10746(最小费用最大流)
- Direct Path Insert与APPEND, PARALLEL的梳理与小结
- 关注你工程里的JAR包----java和J2EE开发的另一种JAR地狱