手势(Gesture)的增加和识别
Android除了提供手势检测之外,还允许把用户手势添加到指定文件中,以备以后使用,当用户再次画出该手势时,系统可识别该手势。Android使用GestureLibrary代表手势库,提供GestureLibraries工具类来创建手势库。GestureLibraries提供如下4个静态方法从不同位置加载手势库:
一旦程序中获得了GestureLibrary对象后,就可以用如下方法来添加、识别手势:
另外Android还提供了一个手势编辑组件:GestureOverlayView,用户可以在上面绘制手势。然后对它绑定事件监听器,响应手势事件开始、结束、完成、取消等事件。下面通过一个简单实例来演示手势的添加以及识别自定义手势,代码如下:
AddGestureActiv:
package com.lovo.activity; import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView; import com.lovo.addgesture.R; public class AddGestureActivity extends Activity {
private GestureOverlayView gestureView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取手势编辑视图
gestureView = (GestureOverlayView) findViewById(R.id.main_gesture);
// 设置手势绘制的颜色
gestureView.setGestureColor(Color.RED);
// 设置手势的绘制宽度
gestureView.setGestureStrokeWidth(4);
// 为 gesture的手势完成事件绑定事件监听器
gestureView.addOnGesturePerformedListener(new OnGesturePerformedListener() { @Override
public void onGesturePerformed(GestureOverlayView overlay,
final Gesture gesture) {
// 加载save.xml界面布局代表的视图
View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
// 获取saveDialog里的show组件
ImageView imageView = (ImageView) saveDialog.findViewById(R.id.save_iv_show);
// 获取saveDialog里的gesture_name组件
final EditText gestureName = (EditText) saveDialog
.findViewById(R.id.save_et_gesture_name);
// 根据Gesture包含的手势创建一个位图
Bitmap bitmap = gesture.toBitmap(128, 128, 10,0xFFFF0000);
imageView.setImageBitmap(bitmap);
// 使用对话框显示saveDialog组件
new AlertDialog.Builder(AddGestureActivity.this)
.setView(saveDialog)
.setPositiveButton("保存",
new android.content.DialogInterface.OnClickListener() { @Override
public void onClick(
DialogInterface dialog,int which) {
// 获取指定文件对应的手势库
GestureLibrary gestureLib = GestureLibraries
.fromFile(AddGestureActivity.this
.getFilesDir()+ "/gestures");
// 添加手势
gestureLib.addGesture(gestureName.getText().toString(),gesture);
// 保存手势库
boolean isSave = gestureLib.save();
String result = isSave ? "保存成功": "保存失败";
Log.i("isSave", result);
}
}).setNegativeButton("取消", null).show();
}
});
Button turnBtn = (Button) findViewById(R.id.main_btn_turn);
turnBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(AddGestureActivity.this,
RecogniseGestureActivity.class);
startActivity(intent);
}
});
}
}
Add布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请在下面屏幕上绘制手势" /> <Button
android:id="@+id/main_btn_turn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="跳转到手势识别界面" />
</LinearLayout>
<!-- 使用手势绘制组件 --> <android.gesture.GestureOverlayView
android:id="@+id/main_gesture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gestureStrokeType="multiple" /> </LinearLayout>
识别手势的Activity:
package com.lovo.activity; import java.util.ArrayList; import android.app.Activity;
import android.app.AlertDialog;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Toast; import com.lovo.addgesture.R; public class RecogniseGestureActivity extends Activity {
// 定义手势编辑组件
private GestureOverlayView gestureView;
// 记录手机上已有的手势库
GestureLibrary gestureLibrary; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recognise);
// 读取上一个程序所创建的手势库
gestureLibrary = GestureLibraries.fromFile(this.getFilesDir()
+ "/gestures");
if (gestureLibrary.load()) {
Toast.makeText(this, "手势文件装载成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "手势文件装载失败!", Toast.LENGTH_SHORT).show();
}
// 获取手势编辑组件
gestureView = (GestureOverlayView) findViewById(R.id.recognise_gesture);
// 为手势编辑组件绑定事件监听器
gestureView
.addOnGesturePerformedListener(new OnGesturePerformedListener() { @Override
public void onGesturePerformed(GestureOverlayView overlay,
Gesture gesture) {
// 识别用户刚刚所绘制的手势
ArrayList<Prediction> predictions = gestureLibrary
.recognize(gesture);
ArrayList<String> result = new ArrayList<String>();
// 遍历所有找到的Prediction对象
for (Prediction pred : predictions) {
// 只有相似度大于2.0的手势才会被输出
if (pred.score > 2.0) {
result.add("与手势【" + pred.name + "】的相似度为"
+ pred.score);
}
}
if (result.size() > 0) {
ArrayAdapter adapter = new ArrayAdapter(
RecogniseGestureActivity.this,
android.R.layout.simple_dropdown_item_1line,
result.toArray());
// 使用一个带List的对话框来显示所有匹配的手势
new AlertDialog.Builder(
RecogniseGestureActivity.this)
.setAdapter(adapter, null)
.setPositiveButton("保存", null).show();
} else {
Toast.makeText(RecogniseGestureActivity.this,
"无法找到匹配的手势!", Toast.LENGTH_SHORT).show();
} }
});
Button turnBtn = (Button) findViewById(R.id.recognise_btn_turn);
turnBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
finish();
}
});
}
}
识别手势的布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请在下面屏幕上绘制手势" /> <Button
android:id="@+id/recognise_btn_turn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="返回到增加手势界面" />
</LinearLayout>
<!-- 使用手势绘制组件 --> <android.gesture.GestureOverlayView
android:id="@+id/recognise_gesture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gestureStrokeType="multiple" /> </LinearLayout>
手势(Gesture)的增加和识别的更多相关文章
- android学习笔记52——手势Gesture,增加手势、识别手势
手势Gesture,增加手势 android除了提供了手势检测之外,还允许应用程序把用户手势(多个持续的触摸事件在屏幕上形成特定的形状)添加到指定文件中,以备以后使用 如果程序需要,当用户下次再次画出 ...
- android学习笔记51——SQLite 手势Gesture
手势Gesture 所谓手势,是指用户手指或触摸笔在触摸屏幕上的连续触碰行为. Androi对两种手势行为都提供了支持: 1.对于第一种手势而言,android提供了手势检测,并为手势检测提供了相应的 ...
- 0128——手势Gesture
UIGestureRecognizer: 1.locationinView 获取手势在某个视图里面的坐标位置 2.delegate监听手势的行为 3.state状态 开始:UIGestureRecog ...
- 【转】 iOS开发之手势gesture详解
原文:http://www.cnblogs.com/salam/archive/2013/04/30/iOS_gesture.html 前言 在iOS中,你可以使用系统内置的手势识别 (Gesture ...
- iOS开发之手势gesture详解(一)
前言 在iOS中,你可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势.GestureRecognizer将低级别的转换为高级别的执行行为,是你绑定到view的对象 ...
- iOS开发之手势gesture详解(二)
与其他用户界面控件交互 UIControl子类会覆盖parentView的gesture.例如当用户点击UIButton时,UIButton会接受触摸事件,它的parentView不会接收到.这仅适用 ...
- eoLinker 新功能发布,增加了识别代码注释自动生成文档功能
产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...
- opencv编译:opencv 3.4.1 编译 contrib模块,增加人脸识别
start cmake-gui select the opencv source code folder and the folder where binaries will be built (th ...
- 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge
以下转自: http://blog.csdn.net/qq1175421841/article/details/50312565 像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的 ...
随机推荐
- 积累的VC编程小技巧之属性页
1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框 ...
- [读书笔记]黑客与画家[Hackers.and.Painters]
(书生注:这本书写的不错.针对程序员,可以带来不同角度的想法,有助于反思自己的程序员工作.我甚至从中发现了自己爱用铅笔的原因... 尤其是其中关于黑客的定义,包括黑客认为的乐趣和目的,让人更深层次思 ...
- Java调用cmd命令 打开一个站点
使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来 怕是忘记,须要时能 ...
- 简单的RPC java实现
RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster Worm virus)袭卷全球的一年.而“冲击波”正是用着RPC这把刀来敲开了远程电脑的大门.当然RPC 有更多正面的应用,比 ...
- [docker]coreOS与atomic对照
声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! 摘自https://majo ...
- win32收不到F10按键消息解决办法
在WM_KEYDOWN中处理F10(VK_F10)消息总是获取不到,后来用spy++监听窗口消息发现按下F10并没有WM_KEYDOWN消息产生,而是产生了WM_SYSKEYDOWN http://b ...
- VMwave下Ubuntu扩展磁盘空间
VMwave下Ubuntu扩展磁盘空间 Ubuntu原预装磁盘空间20G,随着系统安装软件越来越多,空间慢慢不够用. 打算安装DB2,许扩展磁盘空间. 环境: No LSB modules are a ...
- Android 实现自己定义多级树控件和全选与反选的效果
博文開始之前,首先要感谢大牛:(lmj623565791),本博文是在其博文http://blog.csdn.net/lmj623565791/article/details/40212367基础上进 ...
- scala 函数编程
scala 函数编程 Effective Scala.pdf: http://www.t00y.com/file/76767869 Functional_Programming_in_Scal ...
- SecureCRT 连接虚拟机Linux
SecureCRT 连接虚拟机Linux 最近在学习linux,在学习中遇到了一些问题,现总结一下. 虚拟机我用的是VirtualBox,完美支持中文,可以在电脑中创建虚拟机环境,上手非常简单.具 ...