第一步:建立手势库
使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-8\GestureBuilder)。使用GestureBuilder之前,你需要恢复其到开发环境,然后进行编绎并部署到手机上。此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestures
第二步:在应用中加载手势库文件,然后开发手势识别代码。
把手势库文件gestures文件拷贝到项目的res/raw目录下。然后在布局文件中添加用于手势绘制的View:
<android.gesture.GestureOverlayView
android:id="@+id/gestures"
android:layout_width="fill_parent“
android:layout_height="0dip"
android:layout_weight="1.0" />
为View添加手势监听事件:gestureOverlayView.addOnGesturePerformedListener();
得到手势库:mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
加载手势库:mLibrary.load();
List<Prediction>predictions = mLibrary.recognize(gesture);//从手势库中查询匹配的内容,匹配的结果可能包括多个相似的内容,匹配度高的结果放在最前面
大多数情况下,手势都是通过一笔完成。然而有一些特别的需求就需要通过多个笔画来实现,这时可以使用gestureStrokeType属性进行设置:android:gestureStrokeType="multiple"
1.手势使用控件android.gesture.GestureOverlayView
<?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" > <android.gesture.GestureOverlayView android:id="@+id/gestures" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:gestureStrokeType="multiple" /> <Button android:layout_weight="0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/recognize" android:onClick="find" /> </LinearLayout>2.将手势库放在raw文件夹下
3.实现代码
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.GestureOverlayView.OnGestureListener; import android.gesture.GestureOverlayView.OnGesturePerformedListener; import android.gesture.Prediction; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private GestureLibrary library; private Gesture mgesture; private GestureOverlayView overlayView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); library = GestureLibraries.fromRawResource(this, R.raw.gestures); library.load();//加载手势 overlayView = (GestureOverlayView) this.findViewById(R.id.gestures); //只针对单笔手势:overlayView.addOnGesturePerformedListener(new GesturePerformedListener()); overlayView.addOnGestureListener(new GestureListener()); } public void find(View v){ recognize(mgesture); overlayView.clear(true);//清除界面上手势 } //多笔手势监听 private final class GestureListener implements OnGestureListener{ public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { Log.i(TAG, "onGestureStarted()"); } public void onGesture(GestureOverlayView overlay, MotionEvent event) { Log.i(TAG, "onGesture()"); } public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { Log.i(TAG, "onGestureEnded()"); mgesture = overlay.getGesture();//每个手势结束都会调用 } public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) { Log.i(TAG, "onGestureCancelled()"); } } //单笔手势监听 private final class GesturePerformedListener implements OnGesturePerformedListener{ public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { recognize(gesture); } } private void recognize(Gesture gesture) { ArrayList<Prediction> predictions = library.recognize(gesture);//手势匹配 if(!predictions.isEmpty()){//如果有匹配成功 Prediction prediction = predictions.get(0);//数组按匹配度排序,获取匹配度最高度一个手势 if(prediction.score >= 6){//如果匹配度高于60%,prediction.score取之0-10(0%-100%) if("zhangxx".equals(prediction.name)){//对比手势名称 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:1350505050")); startActivity(intent); }else if("close".equals(prediction.name)){ finish();//关闭Activity } }else{ Toast.makeText(getApplicationContext(), "手势匹配度太低", 1).show(); } }else{ Toast.makeText(getApplicationContext(), "手势不匹配", 1).show(); } } @Override protected void onDestroy() { super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid());//关闭应用 } }