最近在研究Android的东西,顺便看了一下关于手势存储和识别相关的知识。然后将Android提供的GestureBuilder Sample程序稍微改动了一下,让其可以提供手势识别的功能。也就是说,在这个小程序中,创建手势、识别手势的功能全有了。这些都是新手入门知识,高手请饶过。
下面是一些关键代码,与大家分享一下:
在App类中,从SD文件中加载GestureLibrary
public void onCreate() {
super.onCreate();
if(_storeFile == null){
_storeFile = new File(this.getExternalFilesDir(null), "gestures");
}
if (_gestureLib == null) {
_gestureLib = GestureLibraries.fromFile(_storeFile);
}
}
GestureLibrary 是Android的手势管理库,可用于手势的读取、存储和识别。
创建和现实手势的方法就不说了,详见GestureBuilder Sample代码。
在GestureRecognizeActivity 类中,首先要放入一个GestureOverlayView让用户可以输入要识别的手势。 然后要给这个view加GestureOverlayView.OnGesturePerformedListener。 这就是关键了,在用户输入完手势后,这个Listener的onGesturePerformed方法会被调用,传入参数中有刚输入的手势。然后将这个手势传入手势库中进行识别就可以了。识别的结果是一个集合,根据match score从大到小排。程序中我以Score > 5作为Match的条件,最终效果比较满意。
_overlay = (GestureOverlayView) findViewById(R.id.gestures_recognize_overlay);
_overlay.addOnGesturePerformedListener(new GesturePerformedProcesser());
GesturePerformedProcesser 类代码:
private class GesturePerformedProcesser implements GestureOverlayView.OnGesturePerformedListener{
@Override
public void onGesturePerformed(GestureOverlayView overlay,
Gesture gesture) {
ArrayList<Prediction> predictions = _gestureLib.recognize(gesture);
if(!predictions.isEmpty()){
Prediction prediction = predictions.get(0);
if(prediction.score > 5){
Toast.makeText(overlay.getContext(), getString(R.string.gesture_recognized, prediction.name), Toast.LENGTH_SHORT).show();
return;
}
}
Toast.makeText(overlay.getContext(), getString(R.string.gesture_unrecognized), Toast.LENGTH_SHORT).show();
}
}