Жесты Android, одиночный и многоходовый результаты дают противоречивые результаты - PullRequest
1 голос
/ 17 июня 2011

+ - × /

У меня действительно странная проблема, когда я следую учебнику по жестам здесь: http://developer.android.com/resources/articles/gestures.html.

В Gesture Builder создано 4 уникальных жеста: + - × /

сложение и умножение - это многоходовые. Вычитание и деление - один ход.

Упражнение загружает предварительно созданную GestureLibrary (R.raw.gestures), добавляет OnGesturePerformedListener в GestureOverlayView и заканчивается onGesturePerformed (), когда жест обнаружен и выполнен.

Схема действий в XML

<android.gesture.GestureOverlayView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gestures"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"

android:gestureStrokeType="multiple"
android:eventsInterceptionEnabled="true"
android:orientation="vertical"
/>

Расположен в onCreate ()

    mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
    if (!mLibrary.load()) {
        finish();
    }

    GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
    gestures.addOnGesturePerformedListener(this);

Находится в onGesturePerformed ()

    ArrayList<Prediction> predictions = mLibrary.recognize(gesture);

    // We want at least one prediction
    if (predictions.size() > 0) {
        Prediction prediction = predictions.get(0);

        // We want at least some confidence in the result
        if (prediction.score > 1.0) {
            // Show the spell
            Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
        }
    }

Основная проблема заключается в том, что встроенные жесты не распознаются правильно. Например, onGesturePerformed () никогда не выполняется, если за горизонтальным жестом следует вертикальный (дополнение). Метод вызывается , если вертикальный жест сопровождается горизонтальным. Вот так ведет себя и GesturesListDemo ( GesturesDemos.zip @ code.google.com ).

Кроме того, предсказанный жест в итоге оказывается неверным. Добавить признается как вычитание; умножить на деление; Вычтите как добавьте. Это полностью противоречиво.

Наконец, сложение и вычитание жестов, как правило, имеют сходные Prediction.score, что странно, поскольку они отличаются на весь ход.

Извините за длинный пост - хотел быть тщательным. Любой совет будет принята с благодарностью, спасибо всем.

Ответы [ 3 ]

1 голос
/ 22 мая 2014

Я понимаю, что это действительно старый вопрос, но на него еще не ответили, и это может кому-то помочь. Я только что столкнулся с подобной проблемой, и мое решение состояло в том, чтобы использовать gesture.getStrokesCount(), чтобы различать одно- и многотактные жесты.

Пример:

ArrayList<Prediction> predictions = mLibrary.recognize(gesture);

// We want at least one prediction
if (predictions.size() > 0) {
    Prediction prediction = predictions.get(0);

    // We want at least some confidence in the result
    if (prediction.score > 1.0) {
        if (gesture.getStrokesCount() > 1) {
            // This is either add or multiply
        }
        else {
            // This is either subtract or divide
        }
    }
}
1 голос
/ 26 ноября 2014

Опираясь на свой ответ Дрю Ледермана, вы можете использовать эту реализацию onGesturePerformed, чтобы всегда получать наилучший результат:

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {

        ArrayList<Prediction> predictions = store.recognize(gesture);
        double highScore = 0;
        String gestureName = "";

        for (Prediction prediction : predictions) {

            if (prediction.score > SCORE && prediction.score > highScore && 
                    store.getGestures(prediction.name).get(0).getStrokesCount() == gesture.getStrokesCount()) {

                highScore = prediction.score;
                gestureName = prediction.name;

            }
        }
        // Do something with gestureName
    }
0 голосов
/ 20 апреля 2012

Да, поддерживаются, по крайней мере, из Android 2.3.3.Но это очень неточно. Проверьте второй пример .

...