android手势创建及识别

来源:互联网 发布:21端口入侵工具 编辑:程序博客网 时间:2024/04/27 16:43

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


1、手势创建

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



1.1、创建绘图区

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay);  
  2.        
  3.        overlay.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);    
  4.       
  5.        overlay.setFadeOffset(2000);  //多笔画每两次的间隔时间  
  6.        overlay.setGestureColor(Color.CYAN);//画笔颜色  
  7.        overlay.setGestureStrokeWidth(6);//画笔粗细值  
  8.          
  9.        overlay.addOnGestureListener(new GesturesProcessor());  

1.2、监听绘制

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. private class GesturesProcessor implements GestureOverlayView.OnGestureListener {  
  2.        public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {  
  3.            mDoneButton.setEnabled(false);  
  4.            mGesture = null;  
  5.        }  
  6.   
  7.        public void onGesture(GestureOverlayView overlay, MotionEvent event) {  
  8.        }  
  9.   
  10.        public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {  
  11.            mGesture = overlay.getGesture();  
  12.            if (mGesture.getLength() < LENGTH_THRESHOLD) {  
  13.                overlay.clear(false);  
  14.            }  
  15.            mDoneButton.setEnabled(true);  
  16.        }  
  17.   
  18.        public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {  
  19.        }  
  20.    }  

1.3、保存手势

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public void 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.             * 获取手势库 
  12.             *   private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures"); 
  13.             *   GestureLibrary sStore = GestureLibraries.fromFile(mStoreFile); 
  14.             *  
  15.             */  
  16.            final GestureLibrary store = GestureBuilderActivity.getStore();  
  17.            store.addGesture(name.toString(), mGesture);  
  18.            store.save();  
  19.   
  20.            setResult(RESULT_OK);  
  21.   
  22.            final String path = new File(Environment.getExternalStorageDirectory(),  
  23.                    "gestures").getAbsolutePath();  
  24.            Toast.makeText(this, getString(R.string.save_success, path), Toast.LENGTH_LONG).show();  
  25.        } else {  
  26.            setResult(RESULT_CANCELED);  
  27.        }  
  28.   
  29.        finish();  
  30.          
  31.    }  


2、手势识别

手势识别也是经过创建绘图区、监听绘制、比对结果三个过程,这里直接给出代码。
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class GesturePerformedActivity extends Activity {  
  2.   
  3.     private final File mStoreFile = new File(  
  4.             Environment.getExternalStorageDirectory(), "gestures");  
  5.   
  6.     // 手势库  
  7.     GestureLibrary mGestureLib;  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate(savedInstanceState);  
  13.   
  14.         setContentView(R.layout.gesture_perform);  
  15.         // 手势画板  
  16.         GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures_overlay);  
  17.   
  18.         gestures.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);  
  19.   
  20.         gestures.setFadeOffset(2000); // 多笔画每两次的间隔时间  
  21.         gestures.setGestureColor(Color.CYAN);// 画笔颜色  
  22.         gestures.setGestureStrokeWidth(6);// 画笔粗细值  
  23.   
  24.         // 手势识别的监听器  
  25.         gestures.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {  
  26.             @Override  
  27.             public void onGesturePerformed(GestureOverlayView overlay,  
  28.                     Gesture gesture) {  
  29.                 // 从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果,匹配度高的结果放在最前面  
  30.                 ArrayList<Prediction> predictions = mGestureLib  
  31.                         .recognize(gesture);      
  32.                 if (predictions.size() > 0) {  
  33.                     Prediction prediction = (Prediction) predictions.get(0);  
  34.                     // 匹配的手势  
  35.                     if (prediction.score > 1.0) { // 越匹配score的值越大,最大为10  
  36.                         Toast.makeText(GesturePerformedActivity.this,  
  37.                                 prediction.name, Toast.LENGTH_SHORT).show();  
  38.                     }  
  39.                 }  
  40.             }  
  41.         });  
  42.   
  43.         if (mGestureLib == null) {  
  44.             mGestureLib = GestureLibraries.fromFile(mStoreFile);  
  45.             mGestureLib.load();  
  46.         }  
  47.     }  
  48.   
  49. }  

                       

示例下载

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


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

0 0
原创粉丝点击