android手勢建立及識別

使用一些瀏覽器或者輸入法應用時會有一些手勢操做,還能夠自定義手勢。這些神奇的操做是怎麼作的呢?這一篇重點記錄手勢的識別和建立。這篇的內容使用到的是android.gesture包,具體的例子參考的是Sample中GestureBuilder程序。html

 

一、手勢建立

    手勢建立主要用到GestureOverlayViewGestureLibraryGestureOverlayView的父類爲android.widget.FrameLayout,是手勢繪圖區。GestureLibrary類主要對手勢進行保存、刪除等操做的,存放手勢的倉庫。下面給出建立手勢的例子,以下圖,能夠定義如圖手勢打開csdn.netjava

 


1.一、建立繪圖區

 

[java]  view plain copy print ? 在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.二、監聽繪製

 

 

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

[java]  view plain copy print ? 在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.    }  


二、手勢識別

手勢識別也是通過建立繪圖區、監聽繪製、比對結果三個過程,這裏直接給出代碼。
[java]  view plain copy print ? 在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. }  

                        

 

示例下載android

 

/**
* @author 張興業
*  iOS入門羣:83702688
*  android開發進階羣:241395671
*  個人新浪微博:@張興業TBOW
*/

 

 

 

最後還有點問題,就是多筆畫識別問題,這裏沒有很好的解決,使用OnGesturePerformedListener接聽結束,有的多筆畫會識別失敗,尤爲簡單的橫線豎線組合,複雜的卻沒有問題。若是使用GestureOverlayView.OnGestureListener監聽結束,每一筆畫都會調用,不能處理未知筆畫數的識別。若是哪位同窗完美解決了多筆畫問題,請多指教,謝謝。瀏覽器

相關文章
相關標籤/搜索