android 手势识别代码

原创 2016年06月01日 11:39:05

手势创建主要用到GestureOverlayViewGestureLibraryGestureOverlayView的父类,GestureLibrary类主要对手势进行保存、删除等操作的,存放手势的仓库。

工程目录:


1、首先先生成手势库,自己绘制喜欢的手势,然后命名好保存。详细代码如下

package com.example.gesture;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
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.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class drawActivity extends Activity {
    private GestureOverlayView gestureView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.drawgesture);
		
		initUI();
	}

	private void initUI() {
		// TODO Auto-generated method stub
		 gestureView = (GestureOverlayView) findViewById(R.id.gesture);
		 // 设置手势的绘制颜色  
	     gestureView.setGestureColor(Color.RED);  
	     // 设置手势的绘制宽度  
	     gestureView.setGestureStrokeWidth(5);
	    // gestureView.setGestureColor(0xff009966);//设置画笔颜色
	    // gestureView.setFadeOffset(2000);//两个笔画之间的时间间隔
	     // 为gesture的手势完成事件绑定事件监听器  
	     gestureView.addOnGesturePerformedListener(new OnGesturePerformedListener() {
			
			@Override
			public void onGesturePerformed(GestureOverlayView overlay,final Gesture gesture) {
				// TODO Auto-generated method stub
				AlertDialog.Builder builder = new AlertDialog.Builder(drawActivity.this);
				LayoutInflater inflater = getLayoutInflater();
			    final View layout = inflater.inflate(R.layout.savegesture, null);
			    
			    ImageView image = (ImageView)layout.findViewById(R.id.show);
				// 根据Gesture包含的手势创建一个位图  
                Bitmap bitmap = gesture.toBitmap(128, 128, 10, 0xFFFF0000);  
                image.setImageBitmap(bitmap); 
                
			    builder.setView(layout);
			    builder.setIcon(R.drawable.ic_launcher);
				builder.setTitle(R.string.title);				
				builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface arg0, int arg1) {
						// TODO Auto-generated method stub
						EditText edit = (EditText)layout.findViewById(R.id.gesture_name);						 
						// 获取指定文件对应的手势库  
                        GestureLibrary gestureLib = GestureLibraries  
                            .fromFile("/sdcard/gestures"); 
                        // 添加手势  
                        gestureLib.addGesture(edit.getText().toString(),gesture);  
                        // 保存手势库  
                        gestureLib.save();  
                        Toast.makeText(getApplicationContext(), "手势保存成功!", Toast.LENGTH_SHORT).show();
					}
				});
				builder.setNeutralButton("cancel", new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface arg0, int arg1) {
						// TODO Auto-generated method stub						
					}
				});
				final AlertDialog dlg = builder.create();
				dlg.show();
			}
		});
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}
	
}
代码布局为:

<?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:orientation="vertical" >
    
    <TextView  
	    android:layout_width="fill_parent"  
	    android:layout_height="wrap_content"
	    android:gravity="center_horizontal"  
	    android:text="@string/ad"/>  
	<!-- 使用手势绘制组件 -->  
	<android.gesture.GestureOverlayView  
	    android:id="@+id/gesture"  
	    android:layout_width="fill_parent"  
	    android:layout_height="fill_parent"  
	    android:gestureStrokeType="multiple" />  
</LinearLayout>

保存手势布局自定义dialog布局

<?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">  
	<LinearLayout  
	    android:orientation="horizontal"  
	    android:layout_width="fill_parent"  
	    android:layout_height="wrap_content">  
		<TextView  
		    android:layout_width="wrap_content"  
		    android:layout_height="wrap_content"  
		    android:layout_marginRight="8dip"  
		    android:text="@string/gesture_name"  
		     />  
		<!-- 定义一个文本框来让用户输入手势名 -->    
		<EditText  
		    android:id="@+id/gesture_name"  
		    android:inputType="none"
		    android:layout_width="fill_parent"  
		    android:layout_height="wrap_content"/>     
	</LinearLayout>  
	<!-- 定义一个图片框来显示手势 -->    
	<ImageView  
	    android:id="@+id/show"  
	    android:layout_width="wrap_content"  
	    android:layout_height="wrap_content"  
	    android:layout_marginTop="5dp" />  
</LinearLayout>

最后还需要添加权限:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、生成的手势库保存路基可自己定义,gestures为手势库的名字
GestureLibrary gestureLib = GestureLibraries.fromFile("/sdcard/gestures"); 
3、手势的使用,在res目录下新建一个raw文件,然后添加手势库进来方便调用,首先是先获取手势库,然后对手势的相似度进行判断,可设置大小。最后对之前定义名手势名字进行判断,再执行自己想操作的。详细代码:

package com.example.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.util.Log;
import android.widget.Toast;

public class useActivity extends Activity {

	GestureOverlayView gestureView;
    GestureLibrary gLibrary;
    boolean loadState;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.usegesture);
		initUI();
	}

	private void initUI() {
		// TODO Auto-generated method stub
		gestureView = (GestureOverlayView) this.findViewById(R.id.myGesture);
        gestureView.addOnGesturePerformedListener(new MyOnGesturePerformedListener());

        // 创建手势库对象GestureLibrary
        gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
        // 加载手势库资源
        loadState = gLibrary.load();
	}

	private final class MyOnGesturePerformedListener implements
    OnGesturePerformedListener {

    	public void onGesturePerformed(GestureOverlayView overlay,
    			Gesture gesture) {
    		if (loadState) {//加载手势资源成功
    			// 获取画的图形进行匹配,匹配程度就是Prediction中的score
    			ArrayList<Prediction> predictions = gLibrary.recognize(gesture);   	
    			if (!predictions.isEmpty()) {// 如果用户画了图形,就会匹配

					Prediction prediction = predictions.get(0);
					Log.i("TAG", String.valueOf(prediction.score));
					 //prediction的score属性代表了与手势的相似程度
				     //prediction的name代表手势对应的字母
					//这里要求匹配度要在30%以上
					if (prediction.score > 3) {// 判断相似度大于3,与里面的两者进行匹配   						   						
                        if ("2".equals(prediction.name)) {//打电话
                        	Toast.makeText(getApplicationContext(), "手势识别成功!", Toast.LENGTH_LONG).show();
                            Intent intent1 = new Intent(Intent.ACTION_CALL,
                                        Uri.parse("tel:668301"));
                            startActivity(intent1);                           	
                        }
                    } else {// 相似度小于1,不识别
                    	Toast.makeText(getApplicationContext(), "手势识别率太低,请重新输入!", Toast.LENGTH_LONG).show();//手势识别率低,请重新输入
                    }
					//判断识别度在百分之20以上
    				if(prediction.score >2){
    					if("3".equals(prediction.name)){
                   		    Toast.makeText(getApplicationContext(), "手势识别成功!", Toast.LENGTH_LONG).show();
                        	//showToast(R.string.send);
                        	Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:668301"));
                        	startActivity(intent);
                   	   }
    				}else {// 相似度小于1,不识别
                    	Toast.makeText(getApplicationContext(), "手势识别率太低,请重新输入!", Toast.LENGTH_LONG).show();//手势识别率低,请重新输入
                    }   					
    			} else {//没有画图形
    				Toast.makeText(getApplicationContext(), "没有手势", Toast.LENGTH_LONG).show();
            	}
    		} else {
    			Toast.makeText(getApplicationContext(), "手势库没有加载成功", Toast.LENGTH_LONG).show();
    		}
    	}
    }	
}
实现的布局代码:

<?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:orientation="vertical" >
    
	<TextView
        android:layout_width="fill_parent"
        android:gravity="center_horizontal"
        android:textSize="20sp"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
     <android.gesture.GestureOverlayView 
        android:id="@+id/myGesture"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1.0"
        />
</LinearLayout>
完整的权限代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gesture"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	<uses-permission android:name="android.permission.CALL_PHONE"/>  
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.gesture.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".drawActivity"></activity>
        <activity android:name=".useActivity"></activity>
    </application>

</manifest>

详细代码下载地址:点击打开链接






版权声明:本文为博主原创文章,未经博主允许不得转载。

Android成长之路-手势识别的实现

手势识别系统: 先把手势库放到项目中:(创建手势库见下一篇博客) 在res文件夹下新建一个名为raw的文件夹,然后把手势库放进去   然后开始项目的创建:   strings.xml: ...
  • like7xiaoben
  • like7xiaoben
  • 2012年01月03日 14:30
  • 3681

Android手势识别详解

一、使用GestureDetector进行手势识别 手势交互过程(原理): 1、触屏一刹那,触发MotionEvent事件 2、被OnTouchListener监听,在onTouch()中获得Moti...
  • c19344881x
  • c19344881x
  • 2015年02月26日 15:22
  • 2340

Android手势识别Demo

//**MainActivity.java** package com.study.geslockdemo;import android.app.Activity; import android.co...
  • u012246348
  • u012246348
  • 2016年04月09日 20:02
  • 785

Android手势识别GestureDetector详解

一、概述当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onT...
  • zhangyalong_android
  • zhangyalong_android
  • 2017年04月07日 11:54
  • 1115

Android-自定义手势识别-复杂手势识别

一、概述 1、手势交互过程(原理) (1)触屏一刹那,触发MotionEvent事件 (2)被OnTounchListener监听,在onTouch()中获得MotionEvent对象 (3)...
  • SQ_Bang
  • SQ_Bang
  • 2016年07月17日 20:37
  • 1047

C++11代码展示:简单的手势识别和响应,上下左右

因为这个是跑酷类游戏的代码,所以向左向右就按照正常的逻辑,上下滑动本来应该是要执行跳跃操作的,暂时场景属于静止状态,所以先逻辑暂时未拉动摄像机前后移动。 C++11的lambda函数实现,用...
  • jingzhewangzi
  • jingzhewangzi
  • 2015年07月20日 00:32
  • 1577

Android基础系列 - 手势识别、运用(一)

Android开发中,几乎所有的事件都会和用户进行交互,而最多的交互形式就是手势了。也有很多手势三方的库。比如 android-gesture-detectors 、AndroidPdfViewer...
  • sw5131899
  • sw5131899
  • 2017年04月18日 17:13
  • 543

OpenCV学习笔记(二十)——手势识别

最近也在玩手势识别,资料找了很多,基本可以分为静态手势识别和动态手势识别,先弄个简单的静态手势识别给大家看看。 基本流程如下: 先滤波去噪-->转换到HSV空间-->根据皮肤在HSV空间的分布做出...
  • yang_xian521
  • yang_xian521
  • 2011年11月02日 10:25
  • 39614

OpenCV手势识别-手掌特征提取

本文对OpenCV轮廓凸包检测以及参考代码两个部分进行合并。并加入自己的图像预处理,包括采集、去背景和二值化。 实现了手掌的特征点提取。 图1 原始图像 步骤1 图像采集 红外摄像头采集回来的图像...
  • huangcanjun187
  • huangcanjun187
  • 2015年05月12日 13:28
  • 7297

21-手势识别

推荐用自带范例中GestureBuilder 生成手势文件,放入res
  • yongzhian
  • yongzhian
  • 2014年08月10日 13:00
  • 577
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 手势识别代码
举报原因:
原因补充:

(最多只允许输入30个字)