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


1、手势创建

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



1.1、创建绘图区

[java] view plain copy print ?
  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、监听绘制


[java] view plain copy print ?
  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、保存手势

[java] view plain copy print ?
  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、手势识别

手势识别也是经过创建绘图区、监听绘制、比对结果三个过程,这里直接给出代码。 [java] view plain copy print ?
  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 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. }  



示例下载

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



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



更多相关文章

  1. Android(安卓)触摸屏手势识别
  2. Android(安卓): GestureDetector手势检测
  3. Android-6步教你自定义View
  4. Android之Paint属性介绍
  5. Android(安卓)Paint的使用以及方法介绍(附源码下载)
  6. 简单的android折线图绘制
  7. Android实现环形进度条的实例
  8. android手势识别总结
  9. Android(安卓)中ShapeDrawable的使用

随机推荐

  1. TextView字体逐渐变淡点以及程序特定list
  2. Android倒计时 Android仿京东倒计时 Andr
  3. Android USB Storage原理(1)
  4. Android Build及相关类
  5. [置顶] android常用网址收集
  6. Android之ScrollView嵌套ListView
  7. Android: Image类浅析(结合YUV_420_888)
  8. Android NDK Cmake学习记录
  9. Android(安卓)沉浸状态栏
  10. Android WebRTC使用解析