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