Сегментация жестов в Android
Я делаю пример работы по обнаружению рукописных букв с помощью жестов Android. Это хорошо работает, когда я вводю 1 символ за раз. Это означает, что когда я пишу A на экране жестом, программа хорошо его распознает (как я уже писал в библиотеке жестов). На данный момент я код, как это.
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
.
}
}
Но мои критерии не таковы. Я хочу узнать слово. Я хочу написать слово за раз так же, как и.
И во время написания слова для каждого успешного совпадения соответствующая буква должна быть напечатана в тексте редактирования так же, как и.
A,N,D,R,O,I,D
Итак, мой вопрос, как я могу получить это? Можно ли сегментировать жесты (сегментировать слово при написании)? Любой пример рабочего кода или ссылки будут приветствоваться.
1 ответ
Если вы пишете слово в виде отдельных букв (то есть не курсивное письмо), как показано на рисунке, приведенном в вопросе. Тогда просто сделай это -
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 в методе ognist (). Если жест распознается, мы печатаем его и очищаем позиции касания, чтобы можно было распознать новую букву.
Пример проекта: http://www.appsrox.com/shared/Cursive_eclipse_project.zip