用户自定义手势,并识别

本文介绍了用户如何自定义手势,并在自己的应用中使用自己的手势。

1、android模拟器上有了gesturebuilder,用户可以通过这个应该自定义一些手势,并且给这个手势取名,这个应该会将手势以文件”gesture“记录在sd卡的目录下,用户将这个文件拷贝到自己的工程资源文件raw文件里。

                      

然后再布局文件里构建识别手势的view

<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="com.example.gesturedemo.MainActivity$PlaceholderFragment" >

    <android.gesture.GestureOverlayView
        android:id="@+id/gesture"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="@string/hello_world" />

</RelativeLayout>

  最后实现的代码如下:当用户在屏幕上划z的时候程序退出,写对勾时,打印ok,同理还可以定义多笔画的识别:

  

package com.example.gesturedemo;

import java.util.ArrayList;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGestureListener;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends ActionBarActivity {
	GestureOverlayView gesture;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gesture=(GestureOverlayView) findViewById(R.id.gesture);
        
        //这里设置gesture属性
        gesture.setGestureColor(0xffff00);
        //为gesture空间添加监听器,这是单个笔画的监听器
        gesture.addOnGesturePerformedListener(new MyListener());
        
        //多笔画的监听器
        gesture.addOnGestureListener(new MyLitener2());
        
    }
 class    MyLitener2 implements OnGestureListener
 {

	@Override
	public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
		//开始的时候执行
		System.out.println("开始划...");
	}

	@Override
	public void onGesture(GestureOverlayView overlay, MotionEvent event) {
		//当某一个手势被划出的方法
		System.out.println("画完了一笔");
	}

	@Override
	public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
		//所有手势画完调用的方法,一般在这里面处理笔画要执行的动作
		System.out.println("所有的笔画都画完");
	}

	@Override
	public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
		// 清空画布上的手势时候调用
		System.out.println("清空手势");
	}
	 
 }
    
    
    
class MyListener implements OnGesturePerformedListener
{

	@Override
	public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
		//创建gesture目录,将raw文件里的手势加载到gesture目录里
		GestureLibrary geLib=GestureLibraries.fromRawResource(MainActivity.this, R.raw.gestures);
		//将目录加载到内存
		geLib.load();
		//在目录里匹配传进来的手势,并按匹配率排序。
		 ArrayList<Prediction> predictions =geLib.recognize(gesture);
		 //获取第一个,匹配率最高的手势
		 Prediction prediction=predictions.get(0);
		 //如果手势匹配率达到50%
		 if(prediction.score>0.5){
			 //按名字匹配是哪个手势,并相应的操作
			 if(prediction.name.equals("z"))
			 {
				 System.out.println("close!!!!!!!!!!!!!!!!");
			 MainActivity.this.finish();
			 }
			 else if(prediction.name.equals("right"))
			 {
				 System.out.println("ok!!!!!!!!!!!!!!!!");
			 }	 
		 
		 }
	}
	
}

}

  

原文地址:https://www.cnblogs.com/bokeofzp/p/4755845.html