android手势创建及识别

简介:

使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势。这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建。这篇的内容使用到的是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监听结束,每一笔画都会调用,不能处理未知笔画数的识别。如果哪位同学完美解决了多笔画问题,请多指教,谢谢。


     本文转自xyz_lmn51CTO博客,原文链接: http://blog.51cto.com/xyzlmn/1344474 ,如需转载请自行联系原作者

相关文章
|
Android开发
Android手势操作耍起来!
目录 前言 初步了解手势操作 六个重写方法 小栗子体验一下 别忘了双击事件 最后 前言 手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的软件.
1031 0
|
Android开发 容器
Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
原文地址:https://developer.android.com/training/gestures/viewgroup.html 在ViewGroup中处理触摸事件要格外小心,因为在ViewGroup中有很多子View,而这些子View对于不同的触摸事件来说是不同的目标。
974 0
|
前端开发 Android开发
Android官方开发文档Training系列课程中文版:手势处理之拖拽或缩放
原文地址:https://developer.android.com/training/gestures/scale.html 这节课主要学习如何使用触摸手势来拖动、放大屏幕上的对象。
1005 0
|
Android开发 索引 存储
Android官方开发文档Training系列课程中文版:手势处理之多点触控处理
原文地址:http://android.xsoftlab.net/training/gestures/multi.html 多点触控是指多个手指同时触摸屏幕的情况。这节课主要学习如何检测多点触控手势。
878 0
|
Android开发 容器
Android官方开发文档Training系列课程中文版:手势处理之滚动动画及Scroller
原文地址:http://android.xsoftlab.net/training/gestures/scroll.html 在Android中,滑动经常由ScrollView类来实现。
790 0
|
Android开发
Android官方开发文档Training系列课程中文版:手势处理之监测通用手势
原文地址:http://android.xsoftlab.net/training/gestures/index.html 引言 这节课将会学习如何让用户通过触摸手势与APP产生交互。
866 0