2013-04-13 35 views
5

Tôi đang thực hiện công việc mẫu của phát hiện thư viết tay thông qua cử chỉ của Android.It hoạt động tốt khi tôi nhập 1 ký tự cùng một lúc. Điều đó có nghĩa là khi tôi viết A trên màn hình bằng cử chỉ, chương trình sẽ nhận ra nó (như tôi đã đặt nó trên thư viện cử chỉ trước đó). Hiện tại tôi viết mã như thế này.Phân đoạn cử chỉ trong 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 
    . 

    } 
} 

Nhưng tiêu chí của tôi không phải như vậy. Tôi muốn nhận ra một từ. Tôi muốn viết một từ tại một thời điểm giống như. example

Và trong khi viết một từ cho mỗi kết hợp thành công, chữ cái tương ứng sẽ được in trên edittext giống như.

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

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể đạt được nó? Có thể phân đoạn các cử chỉ (phân đoạn từ trong khi viết)? Bất kỳ ví dụ mã hoặc liên kết nào đang hoạt động sẽ được đánh giá cao.

Trả lời

4

Nếu bạn viết một từ dưới dạng các chữ cái riêng biệt (ví dụ: không viết chữ thảo) như được hiển thị trong hình ảnh được đưa ra trong câu hỏi. Sau đó, chỉ cần thực hiện việc này -

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

Thực chất là gắn thêm thư mới vào chuỗi văn bản hiện tại.

Nhưng nếu bạn đang nói về viết chữ thảo thì rất phức tạp. Dưới đây là một số mã có thể theo dõi văn bản chữ thảo.

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

Vì vậy, về cơ bản, chúng tôi nắm bắt được vị trí cảm ứng và tạo cử chỉ từ đó chuyển sang nhận dạng() của GestureLibrary. Nếu một cử chỉ được nhận ra thì chúng ta sẽ in ra và xóa các vị trí cảm ứng để có thể nhận ra một chữ cái mới.

Sample Project: Cursive_eclipse_project.zip

+0

Vâng, đó là chữ thảo .. – ridoy

+0

Xem câu trả lời của tôi thay đổi nội dung cho một số mẫu mã. – appsroxcom

+0

Tôi sẽ thử và cho bạn biết, cảm ơn vì nỗ lực của bạn. – ridoy

Các vấn đề liên quan