目标效果:

android 快捷键 自定义 安卓自定义快捷指令_手势识别

 

android 快捷键 自定义 安卓自定义快捷指令_android 快捷键 自定义_02

 

android 快捷键 自定义 安卓自定义快捷指令_自定义手势_03

 

android 快捷键 自定义 安卓自定义快捷指令_自定义手势_04

程序运行,画左箭头提示上一个,画右箭头提示下一个,并且还可以画符号退出程序。


这里自定义手势使用的是GestureOverlayView进行设置的,SDK2.0以上系统都自带了一个GestureBuilder手势库,SDK4.2以前路径是android-sdk-windows\samples\android-10\GestureBuilder,4.2以后路径是sdk-extras-android-support-samples-GestureBuilder,有时可能自己安装的并没有这个库,那就需要下载一个放到路径的目录中,下载地址http://pan.baidu.com/s/1bpbno6r


1.首先需要导入手势库,添加手势文件,模拟器上有现成的软件这一步可以省略,但是真机测试时需要导入在手机上运行,因为我之前导入一次了,所以下边截图时提示红色错号和Finish不能点击,第一次导入都是正常的。(没有图示的直接点击next)

android 快捷键 自定义 安卓自定义快捷指令_GestureBuilder_05

android 快捷键 自定义 安卓自定义快捷指令_GestureOverlayView_06

 

android 快捷键 自定义 安卓自定义快捷指令_手势识别_07


2.运行后,模拟器或手机上会多了一个小程序。

android 快捷键 自定义 安卓自定义快捷指令_GestureBuilder_08


3.打开后添加项目需要的手势,保存后如图三,提示保存路径,模拟器保存路径为storage-sdcard-gestures,真机保存路径为storage-emulated-0-gestures。(可能不同手机路径不同)

android 快捷键 自定义 安卓自定义快捷指令_GestureOverlayView_09

 

android 快捷键 自定义 安卓自定义快捷指令_GestureOverlayView_10

 

android 快捷键 自定义 安卓自定义快捷指令_android 快捷键 自定义_11


4.现在只需要找到gestures文件,打开File Explorer,图一为模拟器的文件路径storage-sdcard-gestures,图二为真机的文件路径mnt-shell-emulated-0-gestures。(暂时不太明白为什么为什么真机的路径和保存时提示的不太一样)

android 快捷键 自定义 安卓自定义快捷指令_GestureOverlayView_12

android 快捷键 自定义 安卓自定义快捷指令_android 快捷键 自定义_13


5.导入gestures文件到桌面,新建项目,在res文件夹下新建raw文件夹,将gestures文件复制到raw文件夹中。


6.activity_main.xml页面放置一个ImageView控件和GestureOverlayView控件,并且使用GestureOverlayView控件将ImageView控件包含起来。(不包含也可以,GestureOverlayView控件默认在所有控件上方)

activity_main.xml页面:

<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"
    tools:context=".MainActivity" >

    <!-- 
    	Android:eventsInterceptionEnabled  定义当手势已经被识别出来时,是否拦截该手势
    	Android:fadeDuration  当用户画完,手势效果淡出的时间
    	Android:fadeEnabled  用户画完之后,手势是否自动淡出
    	Android:gestureColor  手势的颜色
    	Android:gestureStrokeType  笔画的类型
    	Android:geatureStrokeWidth  笔画的粗细
    -->
    <android.gesture.GestureOverlayView
        android:gestureColor="#ff0000"
        android:gestureStrokeWidth="10"
        android:id="@+id/gestureOverlayView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/ivShow"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:src="@drawable/ic_launcher" />
    </android.gesture.GestureOverlayView>

</RelativeLayout>




7.MainActivity.java页面匹配识别手势。


MainActivity.java页面:


package com.example.gestureoverlayview;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
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.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

	private GestureOverlayView gestureOverlayView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		gestureOverlayView=(GestureOverlayView) findViewById(R.id.gestureOverlayView);
	
		/*找到预设定的手势文件并加载进来*/
		final GestureLibrary library=GestureLibraries.fromRawResource(MainActivity.this,R.raw.gestures);//获取手势文件
		library.load();
		/*匹配识别*/
		gestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener() {
			
			@Override
			public void onGesturePerformed(GestureOverlayView arg0, Gesture gesture) {
				//读出手势库中内容 识别手势
				ArrayList<Prediction> mygesture=library.recognize(gesture);
				Prediction predction=mygesture.get(0);
				if(predction.score>=4.0){//相似度大于某个值(数字越大代表要求越相似),说明有该手势
					if(predction.name.equals("exit")){
						finish();
					}else if(predction.name.equals("next")){
						Toast.makeText(MainActivity.this,"下一个",Toast.LENGTH_SHORT).show();
					}else if(predction.name.equals("previous")){
						Toast.makeText(MainActivity.this,"上一个",Toast.LENGTH_SHORT).show();
					}
				}else{
					Toast.makeText(MainActivity.this,"没有该手势",Toast.LENGTH_SHORT).show();
				}
			}
		});
	}
}




8.运行就可以显示目标效果了。