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+手势识别详解

时间: 2024-11-08 22:49:00

Android+手势识别详解的相关文章

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

android动画详解三 动画API概述

· 属性动画与view动画的不同之处 view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码. view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行. view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置.例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它. 使用属性动画系统时,这个限制被

android矩阵详解

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图: 解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 在android.graphics.Matrix中有对应旋转的函

Android ProgressBar详解以及自定义

版本:1.0 日期:2014.5.16 版权:© 2014 kince 转载注明出处 这一次主要说一下Android下的进度条,为什么是它呢,因为近期被其各种美轮美奂的设计所倾倒,计划逐渐去实现.另外一个因素也是它也是为数不多的直接继承于View类的控件,从中可以学习到一些自定义控件的知识.下面列举了一些个人觉得还算漂亮的进度条,仅供参考. 是不是很漂亮,其实就像上面图形展示的那样,进度条大体上无非就是这几种形式.这样一来肯定是需要自定义了,所以方向有两个:要么继承于系统的ProgressBar

Android 菜单详解

Android中菜单分为三种,选项菜单(OptionMenu),上下文菜单(ContextMenu),子菜单(SubMenu) 选项菜单 可以通过两种办法增加选项菜单,一是在menu.xml中添加,该种方式参见Android 资源详解(二) 菜单资源,二是在.java中添加 1.覆盖Activity 的 onCreateOptionsMenu(Menu  menu)方法,当我们第一次打开菜单 时该方法被自动调用. 2.调用Menu的 add()方法添加菜单项(Menultem) ,可以调用Men

Android菜单详解(一)——理解android中的Menu

前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性.An

Android surfaceview详解

周末看<精通Android游戏开发>(Pro Android Games),里面讲到游戏的框架,其中一个重要的概念surfaceview,觉得不是很理解,于是花了一点时间研究了下,写下自己的心得. surface,这个单词的意思是浮在表面的,那么surfaceview就是浮在表面的view了.如果真的这样解释,估计有人要拍砖了.然而,话虽不能这么说,取这个名儿,多少还是有点关系的.surface是一个可见区域. 我们在屏幕上看到的这些view,在屏幕上看到的就是画面,在内存中就是一块内存区.绘

android ViewPager详解

Viewpager 在android界面布局中属于常用类型 ,它可以做导航,页面菜单,进入软件是的欢迎界面 等等.比现在最流行的几款手机软件  ,QQ,微信,微博 等 ,其主界面 都用到了ViewPager,所以学好它,势在必得 ,在这里总结了下, 先用图解 : 这是一个仿微博界面的xml布局 ,他们之间的关系经常搞混淆,怕记不住 ,总结了几句话:ViewPager里面含界面,它的改变控制(title)Imageview的变化,Textview控制页面,并间接控制Title(imageview)

Android LayoutInflater 详解

Android LayoutInflater 详解 简介: 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(). 不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如Button,TextView等等). 使用场景: ①对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflater()来