Android+手势识别详解
今天就来把以前的学习文章与经验简单总结中出来吧,在这里我就直接把代码贴下来了,希望能给初学者做最佳的学习参考,也希望有更多的开发人员来加入 ANDROID开发团队,参与更多的创新方式的开发,好了,今天我就简单的讲解一个关于手势识别的最基础也是最需要去掌握的一个技术节点,因为他能给我们 在开发中可能获得最新的用户体验效果,如利用手势识别,你只需要简单的一个手势操作就可能去完成你想要完成的某件可能比较复杂的事情,如通过一个手势来实 现打电话,而并不需要去找你所需要的电话号码这个比较麻烦的过程了,如你可以通过一个手势识别直接来登录到某个你事先设置好的一个应用,或者登录到某个网 站,设置是去实现你想要对某个应用做出某些动作的操作响应,然而我们要做到这些都不能忽视我们首先需要做的是你必须首先得完成一个最简单的手势操作,世界 上莫过于学习程序最难的就是写第一个Hello,World!程序并打印出来,当然如果你那样做到了,那也才是对其刚刚开始的节奏,再下来我们还得加倍去 学习并完全知道它为什么会实现这样的效果,出了能完成这些最基本的操作还有别的吗,是不是可以在此基础上加些额外的思考呢,OK,为了达到这个目的,我们 先来完成一个最基本的手势识别吧,主要实现的功能有通过一个手势来实现拨打指定某个人的电话与再通过一个手势来实现退出的功能,在这里我就结合SDK下的 一个手势案例直接来操作实现的过程,创建手势库的过程,自己去看D:/toolss/android-sdk-windows/samples /android-8/GestureBuilder这个手势案例吧,好了,我先使用SDK下的GestureBuilder来生成两个手势放于库 /mnt/sdcard/LOST.DIR/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下的源代码为:
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;
}
}
}
问题:大多数手势都是一笔完成,然而需求可能需要两笔或者以上来完成,这时可以使用gestureStrokeType属性进行设
置:android:gestureStrokeType="multiple"
Android+手势识别详解的更多相关文章
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Android ActionBar详解
Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ...
- Android 签名详解
Android 签名详解 AndroidOPhoneAnt设计模式Eclipse 在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...
- Android编译系统详解(一)
++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...
- Android布局详解之一:FrameLayout
原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...
- 【整理修订】Android.mk详解
Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...
- Android菜单详解(四)——使用上下文菜单ContextMenu
之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ...
- Android签名详解(debug和release)
Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...
随机推荐
- OpenVPN配置网桥模式的一些理解
说明: 1.网桥的作用是将所有的网卡都能直连主机所在的路由器,可以把它当做一个独立的PC. 2.OpenVPN设置成网桥之后,IP设置成主机所在的IP网段,这样客户端连接进来之后就是所在主机所在的网络 ...
- ffmpeg的IO操作
ffmpeg 可以通过IO操作将数据读取和存储在文件或网络中 作为数据的读取和写入地址,数据被存放在file,http, ffmpeg 不仅可以编解常用的音视频格式,还可以将数据导入/导出到各种媒介中 ...
- OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子
太戏剧了,昨晚看了佳片有约,还不错,2012版的<完美回顾>,像我这样的人依旧选择用电视或者去影院看电影,在没有中间插播广告的时候,体验憋尿得过程中,总是能突然有非常多的想法,这是用电脑或 ...
- 第十章 OPENWRT安装nohup,因为不明原因nohup没有安装
Available pacaagess里找了coreutils-nohup包,安装好就行了 运行nohup自己的程序的时候可能会出现一下: root@OpenWrt:~# nohup: ignorin ...
- koa2搭建服务器+使用mongoose链接mangodb
使用node搭建服务器,用到了现在比较流行的框架koa. 1.初始化package.json npm init -y 2.安装koa2 npm i koa --save 3.搭建服务器 const K ...
- gpu和cpu区别
GPU的功耗远远超过CPUCache, local memory: CPU > GPU Threads(线程数): GPU > CPURegisters: GPU > CPU 多寄存 ...
- TeX系列: MATLAB和LaTeX结合绘图
目的是在MATLAB中绘图,在LaTeX中利用PGFPlots实现对图的修饰,比如坐标系.坐标轴标记.标题等等.这样能够保证图的中标记与正文文本的一致性,同时又可利用MATLAB强大的数据处理和丰富的 ...
- Python学习 —— 阶段综合练习三
Python学习 —— 阶段综合练习三 综合之前文件与文件夹操作的学习,做以下实例练习:(建议先不要看代码,自己先试着写:代码仅供参考,有多种实现方法) 1. 目录文件遍历(二层目录结构) 1). ...
- IIS - 无后缀(无扩展名)的MIME类型配置
添加一个新的 MIME 类型即可. 文件扩展名:. MIME类型:application/octet-stream
- iOS:视图切换的第二种方式:UINavigationController导航栏控制器
UINavigationController:一个以栈的形式管理多视图的容器,负责子控制器之间的跳转.由于以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,所以出栈后的视图会立即销毁. 介绍: & ...