本文介绍了用户如何自定义手势,并在自己的应用中使用自己的手势。
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!!!!!!!!!!!!!!!!");
}
}
}
}
}