android 手势识别学习
引自http://www.cnblogs.com/android100/p/android-hand.html http://blog.csdn.net/jiangshide/article/details/6293017
android的手势的识别和创建。使用到的是自带的android.gesture包,具体的例子参考的是Sample中GestureBuilder程序,利用该SDK下的GestureBuilder来生成势gestures文件下,然后我们把gestures文件拷贝到新建项目下一个新建的:/res/raw/gestures下,实现手势检测:
main.xml文件中设置如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<android.gesture.GestureOverlayView
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0"
android:gestureStrokeType="multiple"
/>
</LinearLayout>
其配置支字符参数为strings.xml设置如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">手势识别2</string>
<string name="norecohnize">不能识别该手势</string>
<string name="nopediction">手势识别百分率太低,请重新输入</string>
</resources>
src下的mainactivity.jar源代码为:主要实现的功能有通过一个手势来实现拨打指定某个人的电话与再通过一个手势来实现退出的功能,
package com.jsd.gesture; 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.Prediction;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast; public class MainActivity extends Activity {
private GestureLibrary libraray;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); libraray = GestureLibraries.fromRawResource(this, R.raw.gestures);//加载手势库对象
libraray.load();//加载手势库
GestureOverlayView overlayView = (GestureOverlayView)this.findViewById(R.id.gestures); overlayView.addOnGesturePerformedListener(new GestureListener());
} private final class GestureListener implements OnGesturePerformedListener{ @Override
public void onGesturePerformed(GestureOverlayView overlay,
Gesture gesture) {
// TODO Auto-generated method stub
ArrayList<Prediction> predictions = libraray.recognize(gesture);//识别用户输入的手势是否存在手势库中
if(!predictions.isEmpty()){
Prediction prediction = predictions.get(0);//得到匹配的手势
if(prediction.score > 3){
if("close".equals(prediction.name)){
//关闭应用
finish();
}else if("phone".equals(prediction.name)){
//指定某个人打电话
Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:18601159149"));
startActivity(intent); }
}else{
Toast.makeText(MainActivity.this, R.string.nopediction, 1).show();
}
}else{
Toast.makeText(MainActivity.this, R.string.norecohnize, 1).show();
}
} }
/**
* 在这个方法中来调用其关闭
* 关闭应用的方法有三种:
* 1.获取其进程ID来杀死该进程:推介使用:android.process.killProcess(android.os.Process myPid());
* 2.终止正在运行的JAVA虚拟机,从而导致程序终止:System.exist(0);
* 3.强制关闭与该报有关的一切执行:AcitvityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);manager.restartPackage(getPackageName());<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
*/
private void onDstroy() {
// TODO Auto-generated method stu
android.os.Process.killProcess(android.os.Process.myPid());//当ACTIVITY被摧毁的时候我们就把应用给杀死 }
}
代码详解:
手势识别:
1.什么是手势识别技术:如一个人使用一个手指在屏幕上画上某些符号来代表的说需要操作的某项业务,如画个圈代表向某个人打电话等.
2.建立手势哭:类似于数据库,即一些手势符号的数据存储.看一个例子:sdk/samples/android-8/GestureBuilder,建立好的手势库会存在SD卡上面,默认的文件名称为:gestures.
3.根据用户输入的手势后进行判断,如果其数据库存在相应的手势就返回出来,
4.在res下面新建一个专门用来存放静态文件的目录raw,把手势库文件拷贝其目录文件下,当然它也会在gen目录下的R类中生成关于该文件的一个常量引用
5.然后在main.xml中写入:
<android.gesture.GestureOverlayView
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0"/>
通过以上的控件,用户就会通过手指在手机上画对应符号出来,然后就需要在代码进行引用了:GestureOverlayView
overlayView = (GestureOverlayView)this.findViewById(R.id.gestures);
6.添加一个手势绘制完之后的监听事件:overlayView.addOnGesturePerformedListener(new GestureListener());
7.提供一个类来对手势监听实现接口:private final class GestureListener implements
OnGesturePerformedListener{
//当用户画完之后就会给用户一个参数传入其方法
public void onGesturePerformed(GestureOverlayView overlay,Gesture gesture){//实现接口的方法
//下面就需要判断手势是否存在数据库中与其精度是否达到要求,这时需要加载手势库这个类:
ArrayList<Prediction> prediction = libraray.recognize(gesture);//识别用户输入的手势是否存在手势库中,并返回所有跟这个手势相似的手势,并且它会把相似度最高的手势放在最前面,也就是说在这个机会中的第一
个元素相似度是最高的,现在只需要相似度最高的手势即可:
if(!predictions.isEmpty()){
Prediction prediction = predictions.get(0);//得到最匹配的手势
if(prediction.score){//判断相似度:0~10 >40%即可
if("close".equals(prediction.name)){
//关闭应用:1.首先获取当前进程ID,然后杀死该进程(建议使用):android.Process.killProcess(android.os.Process myPid());
2.终止当前正在运行的Java虚拟机,导致程序终止:System.exit(0);
3.强制关闭与该包有关联的一切执行:ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);manager.restartPackage(getPackageName());<uses-permission
android:name="android.permission.RESTART_PACKAGERS"/>;这里需要注意,我们不能在这里直接使用这三种方法中的一 种,如果这样的话ACTIVITY的ONDESTORY()方法就无法调用以至于无法正常关闭,但是我们可以在这里点调用finish()方法 来让其ACTIVITY先正常关闭,然后在触发ONDESTORY()里进行调用 }else if("phone".equals(prediction.name)){
//指定一个人打电话
}
}else{
Toast.makeText(MainActivity.this,R.string/nopediction,1).show;
}
}else{
Toast.makeText(MainActivity.this,R.string.norecognize,1).show;
}
}
}
android 手势识别学习的更多相关文章
- Android 手势水平监听判断
package com.zihao.ui; import com.zihao.R; import android.os.Bundle; import android.app.Activity; imp ...
- Android手势锁实现
最终效果如下 整体思路 a.自定义了一个RelativeLayout(GestureLockViewGroup)在里面会根据传入的每行的个数,生成多个GestureLockView(就是上面一个个小圈 ...
- Android手势源码浅析-----手势绘制(GestureOverlayView)
Android手势源码浅析-----手势绘制(GestureOverlayView)
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...
- Android手势滑动Tab
Android手势滑动Tab //MainActivity.java public class MainActivity extends TabActivity { ; ; ; private Ges ...
- Android 手势操作识别
(转自:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html) 首先,在Android系统中,每一次手势交互都会依照 ...
- android手势创建及识别
使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势.这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建.这篇的内容使用到的是android.gesture包,具体的例子参考的是S ...
- Android手势解锁, 九宫格解锁
给大家介绍一个很好用的手势解锁控件ShapleLocker, 废话不多先上效果图: 这是一个第三方库, 可自己根据UI需求替换图标: 圆圈, 小箭头等等.. github地址: http://pane ...
- Android手势操作
xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...
随机推荐
- JDK下载和安装
1.下载并安装JDK ,最新版本为1.8.0,官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 点击所 ...
- array_walk与array_map 的不同 array_filter
array_walk 主要是要对数组内的每个值进行操作,操作结果影响原来的数组 array_map主要是对数组中的值进行操作后返回数组,以得到一个新数组 wallk 可以没有返回值 map要有,因 ...
- eclipse4.3 安装tomcat8
Go to the WTP downloads page, select the 3.6.0 version , and download the zip (under Traditional Zip ...
- repeat帮定删除按钮事件,并且生成去人删除提示
前台 <ItemTemplate> <tr> <td> <asp:LinkButton ID="LinkButton_cancel" On ...
- Tomcat服务器顶层结构和启动过程【转】
号外:2016 最流行的是哪一种 Java 应用服务器呢? 通过从部署的 1240 个 JVM 中得到的数据,我们能够确定出现了 862 个容器供应商,或者说是占到了运行环境的 70% 左右.这些容器 ...
- linux tar包追加问题【转】
只能已归档的文件才能追加文件. 如果tar.gz文件是如此生成:#tar -zcvf test.tar.gz a.txt即tar.gz是压缩(-z)和归档(-c)文件,则无法给它追加文件:若果tar ...
- 学习笔记:GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2)
GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2) GLSL 是一种管道,一种图形化的流水线 1.GLSL 的具体工作流程: 简化流程如下: ...
- PHP5.4 for Apache, php 5.4.0安装过程、方法、配置 ; Apache2.2支持php5.4的配置方法
那我们如何选择下载哪个版本的PHP呢?如果你是在windows下使用Apache+PHP的,请选择VC6版本:如果你是在windows下使用IIS+PHP的,请选择VC9版本. 二.如何选择PHP5. ...
- jquery从tr获取td
已知HTML:<tr id="row001"><td>001</td><td>张三</td></tr>JQU ...
- 安装mysql ,从 mysql-5.5.5 开始innodb作为默认的存储引擎了
[root@Linux opt]# tar -xvf MySQL-5.6.16-1.rhel5.x86_64.rpm-bundle.tar MySQL-shared-compat-5.6.16-1.r ...