2013-04-13 19 views
5

Sto facendo un esempio di lavoro di rilevamento lettera manoscritta tramite gesti di Android. Funziona bene quando inserisco 1 carattere alla volta. Ciò significa che quando scrivo con il gesto A sullo schermo, il programma lo riconosce bene (come ho fatto prima in libreria dei gesti). A partire da ora codice come questo.Segmentazione dei gesti in 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 
    . 

    } 
} 

Ma il mio criterio non è quello. Voglio riconoscere una parola. Voglio scrivere una parola alla volta solo come. example

E durante la scrittura di una parola per ogni corrispondenza riuscita, la lettera corrispondente deve essere stampata su edittext proprio come in.

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

Quindi la mia domanda è come posso ottenerlo? È possibile segmentare i gesti (segmentare la parola mentre si scrive)? Qualsiasi esempio o collegamento di codice funzionante sarebbe apprezzato.

risposta

4

Se si scrive una parola come lettere separate (vale a dire scrittura non corsiva) come mostrato nell'immagine fornita nella domanda. Quindi, fai semplicemente questo -

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); 
     } 
    } 
} 

Che essenzialmente aggiunge la nuova lettera alla stringa di edittext esistente.

Ma se si parla di scrittura corsiva, allora è molto complicato. Ecco un codice che può tracciare la scrittura corsiva.

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(); 
     } 
    } 
} 

Quindi, in pratica si colgono le posizioni di contatto e creiamo un gesto da esso che passano a riconoscere() metodo di GestureLibrary. Se viene riconosciuto un gesto, lo stampiamo e cancelliamo le posizioni tattili in modo che una nuova lettera possa essere riconosciuta.

progetto di esempio: Cursive_eclipse_project.zip

+0

Sì, è corsivo .. – ridoy

+0

Vedere la mia risposta a cura di alcuni esempi di codice. – appsroxcom

+0

Lo proverò e ti farò sapere, grazie per il tuo impegno. – ridoy