手势识别

来源:互联网 发布:杰克棋牌透视软件 编辑:程序博客网 时间:2024/04/30 23:02

今天就来把以前的学习文章与经验简单总结中出来吧,在这里我就直接把代码贴下来了,希望能给初学者做最佳的学习参考,也希望有更多的开发人员来加入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"

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 装车牌照的螺丝孔小了怎么办 北京摇号之后中签和未中签怎么办 拉轿车的大车出车祸车怎么办 美图m6手机忘记锁屏密码怎么办 微信验证码登录收不到验证码怎么办 微信被限制登录收不到验证码怎么办 微信登录申诉收不到短信怎么办 登录微信手机收不到验证码怎么办 美图t8冲一会电就发烧怎么办 美图t8系统不小心升级了 怎么办 美图手机看相册视频就会变黑怎么办 苹果4s屏幕唤醒速度慢怎么办 美图m4换电池后不显示卡怎么办 美图手机久没充电再充没反应怎么办 美图6s开不开机怎么办 苹果4s照片不能拍照黑屏怎么办 美图手机开机键坏了怎么办 金立金刚二手机烧卡怎么办 金立金刚手机开不开机怎么办 小米4手机拆机信号不好怎么办 荣耀自带游览器无法正常打开怎么办 苹果4s电池越来越不耐用怎么办 苹果4s电池不耐用了怎么办 苹果手机4s电池不耐用怎么办 红米4s电池不耐用怎么办 32位app私密相册打不开怎么办 红米手机取卡针断手机里了怎么办 我差评了客服打电话骂我怎么办 顺丰快递在预计时间没有回来怎么办 同款商品比京东便宜怎么办 京东自营不支持7天退货怎么办 天猫买了一个月的电动车坏了怎么办 发票号码和机打号码不一致怎么办 交电费的本子弄丢了怎么办 快递正在派件中发现地址错了怎么办 快递当天送达当天签收还算延怎么办 深圳国税公众号预约取号公司怎么办 社保买了停了2年怎么办 qq号被冻结申请不回来了怎么办 qq号被冻结 手机密保忘了怎么办 微信账号封了2天怎么办