Android手势,单笔画&多冲程产生不一致的结果

时间:2011-06-17 03:00:56

标签: java android xml gestures

+ - × /

我在遵循手势教程时遇到了一个非常奇怪的问题: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 个答案:

答案 0 :(得分:1)

我意识到这是一个非常古老的问题,但它还没有得到回答,这可能对某人有所帮助。我刚刚遇到了类似的问题,我的解决方案是使用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 :(得分:1)

根据Drew Lederman的回答,您可以使用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
    }

答案 2 :(得分:0)

是的,支持,至少从Android 2.3.3开始。但它非常不精确。 Check the second example