2013-04-13 49 views
5

我正在通過Android手勢做手寫字母檢測的示例工作。當我一次輸入1個字符時,它運行良好。這意味着當我通過手勢在屏幕上書寫A時,程序會很好地識別它(正如我之前將其放在手勢庫上)。截至目前,我的代碼是這樣的。Android中的手勢分割

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
    ArrayList<Prediction> predictions = gLib.recognize(gesture); 

if (predictions.size() > 0 && predictions.get(0).score > 1.0) { 

    String letter = predictions.get(0).name; 

    Toast.makeText(this, letter, Toast.LENGTH_SHORT).show(); 

    if(letter.contains("A")) //when matches i print it to edittext 
    edittext.setText("A"); 
    . 
    .  //rest of stuff here like previous way 
    . 

    } 
} 

但我的標準不是這樣。我想認出一個詞。我想一次寫一個字,就像。 example

在編寫每個成功匹配的單詞時,相應的字母應該在edittext上打印,就像。

A,N,D,R,O,I,D 

所以我的問題是我如何獲得它?是否有可能分割手勢(在寫作時分割單詞)?任何工作代碼示例或鏈接將不勝感激。

回答

4

如果您將單詞寫成單獨的字母(即不是草寫字母),如問題中給出的圖像所示。然後乾脆這樣做 -

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
    ArrayList<Prediction> predictions = gLib.recognize(gesture); 

    if (predictions.size() > 0) { 
     Prediction prediction = predictions.get(0); 
     String letter = prediction.name; 

     if (prediction.score > 1.0) { 
      edittext.setText(edittext.getText().toString() + letter); 
     } 
    } 
} 

這實質上是將新的字母追加到現有的edittext字符串。

但是,如果你正在談論草書寫,那麼它很複雜。這裏有一些可以跟蹤草書寫的代碼。

public class MainActivity extends Activity { 
    private Handler mHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Tracker t = new Tracker(); 
     t.start(); 
    } 

    @Override 
    protected void onPause() { 
     if (mHandler != null) 
      mHandler.getLooper().quit(); 
     super.onPause(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_MOVE: 
      if (mHandler != null) { 
       Message msg = Message.obtain(); 
       msg.obj = event.getX() + "," + event.getY(); 
       mHandler.sendMessage(msg); 
      } 
      break; 
     } 
     return true; 
    } 

    private class Tracker extends Thread { 
     private static final int LETTER_SIZE = 30; 

     private GestureLibrary gLib; 
     private ArrayList<GesturePoint> points; 

     public Tracker() { 
      points = new ArrayList<GesturePoint>(); 
      gLib = GestureLibraries.fromRawResource(MainActivity.this, R.raw.gestures); 
      gLib.load(); 
     } 

     @Override 
     public void run() { 
      Looper.prepare(); 
      mHandler = new Handler() { 

       public void handleMessage(Message msg) { 
        String[] pos = String.valueOf(msg.obj).split(","); 
        points.add(new GesturePoint(Float.parseFloat(pos[0]), Float.parseFloat(pos[1]), System.currentTimeMillis())); 

        if (points.size() < LETTER_SIZE) return; 

        GestureStroke stroke = new GestureStroke(points); 
        Gesture gesture = new Gesture(); 
        gesture.addStroke(stroke); 

        ArrayList<Prediction> predictions = gLib.recognize(gesture); 
        if (predictions.size() > 0) { 
         Prediction prediction = predictions.get(0); 
         String letter = prediction.name; 

         if (prediction.score > 1.0) { 
          Log.e("Found", letter); 
          points.clear(); 
         } 
        } 
       } 
      };   
      Looper.loop(); 
     } 
    } 
} 

所以基本上我們捕獲觸摸位置,並創建一個手勢,它通過識別GestureLibrary的方法。如果一個手勢被識別,那麼我們打印它並清除觸摸位置,以便可以識別出一個新的字母。

範例項目Cursive_eclipse_project.zip

+0

是的,這是草書.. – ridoy

+0

見我編輯了一些示例代碼的答案。 – appsroxcom

+0

我會嘗試並讓你知道,謝謝你的努力。 – ridoy