• android手势创建及识别


    源码:http://files.cnblogs.com/android100/gesture.builder.zip

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

     

    1、手势创建

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

     


    1.1、创建绘图区

     
    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、监听绘制

     
    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、保存手势

    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、手势识别

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

                           

     

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

  • 相关阅读:
    Oracle视图,索引,序列
    Oracle的表创建和事务管理
    Oracle子查询和多表查询
    python实现二叉树
    python实现二分查找
    python实现各种排序算法
    flask邮件发送
    django之图片预览实现方法
    django ORM操作
    Django Form之select自动更新
  • 原文地址:https://www.cnblogs.com/android100/p/android-hand.html
Copyright © 2020-2023  润新知