一、准备手势库:

  使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-10\GestureBuilder)。使用GestureBuilder之前,你需要恢复其到开发环境,将其他正确项目下的".classpath",".project"和"project.properties"三个文件拷贝到GestureBuilder项目下,导入到开发环境,然后进行编绎并部署到手机上。此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestures。

二、开发:

  1、配置文件:

  在配置文件中加入拨打电话权限,后面用到打电话。

<!-- 拨打电话  --><uses-permission android:name="android.permission.CALL_PHONE"/>

  布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><!--gestureStrokeType:可以设置单笔识别或多笔识别layout_weight:优先级别默认为0,最高为0,次之1...。显示界面时,先测量按钮的高度,然后再用窗口高度减去按钮高度,所得的高度设置到手势界面--><android.gesture.GestureOverlayViewandroid:id="@+id/gestures"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_above="@+id/btnCheck"android:layout_weight="1"android:gestureStrokeType="multiple" /><Buttonandroid:id="@+id/btnCheck"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:layout_marginBottom="5dp"android:layout_weight="0"android:onClick="match"android:text="@string/check" />
</RelativeLayout>

  2、后台代码:

package com.example.gesture;import java.util.List;import android.R.anim;
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.Prediction;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG="Gesture";private GestureOverlayView gestureOverlayView;private GestureLibrary mLibrary;private boolean state;private Gesture gesture;//用户最终画完手势
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);state = mLibrary.load();//加载手势库Log.i(TAG, state+"");gestureOverlayView = (GestureOverlayView)this.findViewById(R.id.gestures);//当用户完成一次Gesture绘制后,系统将自动调用Listener对象的onGesturePerformed()方法,只支持单笔手势//gestureOverlayView.addOnGesturePerformedListener(new GestureListener());//可以监听单笔和多笔识别gestureOverlayView.addOnGestureListener(new MyGestureListener());}public void match(View v){matchGesture(gesture);gestureOverlayView.clear(true);}//单多笔监视private final class MyGestureListener implements OnGestureListener{@Overridepublic void onGesture(GestureOverlayView overlay, MotionEvent event) {Log.i(TAG, "onGesture() ... ");}@Overridepublic void onGestureCancelled(GestureOverlayView overlay,MotionEvent event) {Log.i(TAG, "onGestureCancelled() ... ");}@Overridepublic void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {Log.i(TAG, "onGestureEnded() ... ");gesture=overlay.getGesture();}@Overridepublic void onGestureStarted(GestureOverlayView overlay,MotionEvent event) {Log.i(TAG, "onGestureStarted() ... ");}}//单笔手势监听类private final class GestureListener implements GestureOverlayView.OnGesturePerformedListener{@Overridepublic void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {if(state){matchGesture(gesture);}}}private void matchGesture(Gesture gesture) {//123:对号,258:X,369:李,456:Z//从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果,匹配度高的结果放在最前面List<Prediction> predictions = mLibrary.recognize(gesture);if(!predictions.isEmpty()){Prediction prediction = predictions.get(0);//prediction的score属性代表了与手势的相似程度//prediction的name代表手势对应的名称if(prediction.score > 6){if("123".equals(prediction.name)){Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:159016"));startActivity(intent);}else if ("456".equals(prediction.name)) {finish();//关闭activity,会触发onDestroy方法,进而关闭应用}else if ("369".equals(prediction.name)) {Toast.makeText(getApplicationContext(), "结果:李", Toast.LENGTH_LONG).show();}else if ("258".equals(prediction.name)) {Toast.makeText(getApplicationContext(), "结果:X", Toast.LENGTH_LONG).show();}}else {Toast.makeText(getApplicationContext(), R.string.notfull, Toast.LENGTH_LONG).show();}}else{Toast.makeText(getApplicationContext(), R.string.notfind, Toast.LENGTH_LONG).show();}}@Overrideprotected void onDestroy() {//杀掉进程super.onDestroy();android.os.Process.killProcess(android.os.Process.myPid());//关闭应用
    }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}

转载于:https://www.cnblogs.com/lbangel/p/3463800.html

Android学习笔记_28_手势识别相关推荐

  1. Android学习笔记21:ImageView获取网络图片

    Android平台有3种网络接口可以使用,它们分别是:java.net.*(标准java接口).org.apache(Apache接口)和android.net.*(Android网络接口).本文将使 ...

  2. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  3. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  4. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  5. Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...

  6. Android学习笔记:TabHost 和 FragmentTabHost

    2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget ...

  7. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  8. Android学习笔记:TabHost 和 FragmentTabHost(转)

    Android学习笔记:TabHost 和 FragmentTabHost(转) 转自:http://www.cnblogs.com/asion/p/3339313.html 作者:Asion Tan ...

  9. Pro Android学习笔记(三三):Menu(4):Alternative菜单

    什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...

最新文章

  1. 科学家解码脑信号以控制机器人假肢
  2. 成都理工大学计算机报告,[2017年整理]成都理工大学通信工程计算机网络综合课程设计报告.doc...
  3. 超简易复制Model对象(为后续备忘录设计模式博文做铺垫)
  4. QT的QDBusVariant类的使用
  5. 【Attention】Visual Attention Network
  6. css --- 圣杯布局
  7. NVIDIA英伟达的Multi-GPU多卡通信框架NCCL
  8. JavaScript 中的 this 到底指向谁?
  9. MATLAB修改代码字体
  10. Ink脚本语言学习笔记(三)
  11. Linux运维工程师综合面试题
  12. CentOS8 安装mysql8- 解压安装版
  13. vue2.0,3.0官网
  14. 使用Bitmap生成透明底图,并保存到本地SD卡中
  15. 如何在webots中绘制运动轨迹
  16. python 散点图
  17. nDPI – 快速入门指南
  18. 负载均衡技术原理浅析
  19. Java基础及API总结
  20. python 花括号、中括号以及小括号的区别

热门文章

  1. vue_2.0_fyf
  2. 2021-02-05仅供自己参考:多态使用
  3. SDR软件移步BG1ICA.vicp.net:8888
  4. php后台跨域token,JSON Web Token(JWT)目前最流行的跨域身份验证解决方案(PHP)类...
  5. 在祝贺提拔的饭局上当众敬酒,别说“感谢领导”,高手都懂这4点
  6. 跳一跳python辅助软件思路及源码解析
  7. 10.高光反射Blinn
  8. keil出现no source“: Error: command-line: #564: cannot open解决方法
  9. JavaScript - 运算符与表达式
  10. 干货来了!2019阿里云合作伙伴峰会SaaS加速器专场回顾合集:嘉宾分享、深度解读