使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势。这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建。这篇的内容使用到的是android.gesture包,具体的例子参考的是Sample中GestureBuilder程序。


1、手势创建

   手势创建主要用到GestureOverlayViewGestureLibraryGestureOverlayView的父类为android.widget.FrameLayout,是手势绘图区。GestureLibrary类主要对手势进行保存、删除等操作的,存放手势的仓库。下面给出创建手势的例子,如下图,可以定义如图手势打开csdn.net


20131122172258781

1.1、创建绘图区

  1. GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay);  

  2.       overlay.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);    

  3.       overlay.setFadeOffset(2000);  //多笔画每两次的间隔时间

  4.       overlay.setGestureColor(Color.CYAN);//画笔颜色

  5.       overlay.setGestureStrokeWidth(6);//画笔粗细值

  6.       overlay.addOnGestureListener(new GesturesProcessor());  


1.2、监听绘制


  1. privateclass GesturesProcessor implements GestureOverlayView.OnGestureListener {  

  2. publicvoid onGestureStarted(GestureOverlayView overlay, MotionEvent event) {  

  3.           mDoneButton.setEnabled(false);  

  4.           mGesture = null;  

  5.       }  

  6. publicvoid onGesture(GestureOverlayView overlay, MotionEvent event) {  

  7.       }  

  8. publicvoid onGestureEnded(GestureOverlayView overlay, MotionEvent event) {  

  9.           mGesture = overlay.getGesture();  

  10. if (mGesture.getLength() < LENGTH_THRESHOLD) {  

  11.               overlay.clear(false);  

  12.           }  

  13.           mDoneButton.setEnabled(true);  

  14.       }  

  15. publicvoid onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {  

  16.       }  

  17.   }  


1.3、保存手势

  1. publicvoid addGesture(View v) {  

  2. if (mGesture != null) {  

  3. final TextView input = (TextView) findViewById(R.id.gesture_name);  

  4. final CharSequence name = input.getText();  

  5. if (name.length() == 0) {  

  6.               input.setError(getString(R.string.error_missing_name));  

  7. return;  

  8.           }  

  9. /**

  10.            * 获取手势库

  11.            *   private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");

  12.            *   GestureLibrary sStore = GestureLibraries.fromFile(mStoreFile);

  13.            *

  14.            */

  15. final GestureLibrary store = GestureBuilderActivity.getStore();  

  16.           store.addGesture(name.toString(), mGesture);  

  17.           store.save();  

  18.           setResult(RESULT_OK);  

  19. final String path = new File(Environment.getExternalStorageDirectory(),  

  20. "gestures").getAbsolutePath();  

  21.           Toast.makeText(this, getString(R.string.save_success, path), Toast.LENGTH_LONG).show();  

  22.       } else {  

  23.           setResult(RESULT_CANCELED);  

  24.       }  

  25.       finish();  

  26.   }  



2、手势识别

手势识别也是经过创建绘图区、监听绘制、比对结果三个过程,这里直接给出代码。
  1. publicclass GesturePerformedActivity extends Activity {  

  2. privatefinal File mStoreFile = new File(  

  3.            Environment.getExternalStorageDirectory(), "gestures");  

  4. // 手势库

  5.    GestureLibrary mGestureLib;  

  6. @Override

  7. protectedvoid onCreate(Bundle savedInstanceState) {  

  8. // TODO Auto-generated method stub

  9. super.onCreate(savedInstanceState);  

  10.        setContentView(R.layout.gesture_perform);  

  11. // 手势画板

  12.        GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures_overlay);  

  13.        gestures.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);  

  14.        gestures.setFadeOffset(2000); // 多笔画每两次的间隔时间

  15.        gestures.setGestureColor(Color.CYAN);// 画笔颜色

  16.        gestures.setGestureStrokeWidth(6);// 画笔粗细值

  17. // 手势识别的监听器

  18.        gestures.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {  

  19. @Override

  20. publicvoid onGesturePerformed(GestureOverlayView overlay,  

  21.                    Gesture gesture) {  

  22. // 从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果,匹配度高的结果放在最前面

  23.                ArrayList<Prediction> predictions = mGestureLib  

  24.                        .recognize(gesture);      

  25. if (predictions.size() > 0) {  

  26.                    Prediction prediction = (Prediction) predictions.get(0);  

  27. // 匹配的手势

  28. if (prediction.score > 1.0) { // 越匹配score的值越大,最大为10

  29.                        Toast.makeText(GesturePerformedActivity.this,  

  30.                                prediction.name, Toast.LENGTH_SHORT).show();  

  31.                    }  

  32.                }  

  33.            }  

  34.        });  

  35. if (mGestureLib == null) {  

  36.            mGestureLib = GestureLibraries.fromFile(mStoreFile);  

  37.            mGestureLib.load();  

  38.        }  

  39.    }  

  40. }  


SouthEast SouthEast


示例下载

/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/



最后还有点问题,就是多笔画识别问题,这里没有很好的解决,使用OnGesturePerformedListener接听结束,有的多笔画会识别失败,尤其简单的横线竖线组合,复杂的却没有问题。如果使用GestureOverlayView.OnGestureListener监听结束,每一笔画都会调用,不能处理未知笔画数的识别。如果哪位同学完美解决了多笔画问题,请多指教,谢谢。