【问题标题】:Storing and retrieving gestures in gesture library在手势库中存储和检索手势
【发布时间】:2013-06-17 14:55:05
【问题描述】:

我正在写一个密码保护类型的东西,基本上应用程序会提示你创建一个手势,将它存储在某个地方(这是我遇到问题的地方)然后检索它并将它与你输入的内容进行匹配“密码”。

对于手势创建,我有如下:

public class GestureUnlock extends Activity {
private static final float LENGTH_THRESHOLD = 120.0f;
private Gesture mGesture;
private View mConfirmButton;
private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gesture_unlock);

    mConfirmButton = findViewById(R.id.confirmButton);

    GestureOverlayView overlay = (GestureOverlayView)findViewById(R.id.gestureOverlayView);
    overlay.addOnGestureListener(new GesturesProcessor());
}

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (mGesture != null) {
        outState.putParcelable("gesture", mGesture);
    }
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    mGesture = savedInstanceState.getParcelable("gesture");
    if (mGesture != null) {
        final GestureOverlayView overlay =
                (GestureOverlayView) findViewById(R.id.gestureOverlayView);
        overlay.post(new Runnable() {
            public void run() {
                overlay.setGesture(mGesture);
            }
        });
        mConfirmButton.setEnabled(true);
    }
}

public void confirm(View v) {
    if (mGesture != null) {

        GestureLibrary store = GestureLibraries.fromFile(mStoreFile);
        store.addGesture("Gesture Password", mGesture);
        store.save();

        setResult(RESULT_OK);

        Intent intent = new Intent(this, GestureConfirm.class);
        startActivity(intent);

    } else {
        setResult(RESULT_CANCELED);
    }
}

public void clear(View v) {
    GestureOverlayView overlay = (GestureOverlayView)findViewById(R.id.gestureOverlayView);
    overlay.cancelClearAnimation();
    overlay.clear(true);
}

private class GesturesProcessor implements GestureOverlayView.OnGestureListener {
    public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
        mConfirmButton.setEnabled(false);
        mGesture = null;
    }
    public void onGesture(GestureOverlayView overlay, MotionEvent event) {
    }

    public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
        mGesture = overlay.getGesture();
        if (mGesture.getLength() < LENGTH_THRESHOLD) {
            overlay.clear(false);
        }
        mConfirmButton.setEnabled(true);
    }
    public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
    }
}
}

这是第一个代码,负责首先创建手势。注意事项:布局是一个手势叠加,两个按钮,一个重置手势,一个关联confirm方法。

公共类 GestureConfirm 扩展 Activity 实现 OnGesturePerformedListener {

private final File mStoreFile = new File(Environment.getExternalStorageDirectory(), "gestures");
private GestureLibrary store = GestureLibraries.fromFile(mStoreFile);

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gesture_confirm);

    GestureOverlayView gesturesView = (GestureOverlayView) findViewById(R.id.gestureOverlayViewConfirm);
    gesturesView.addOnGesturePerformedListener(this);
    store.load();

}

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    ArrayList<Prediction> predictions = store.recognize(gesture);
    for (Prediction prediction : predictions) {
        if (prediction.score > 1.0) {
            Toast.makeText(this, prediction.name, Toast.LENGTH_SHORT).show();
        }
    }
}
}

这是我负责读取手势的代码。

【问题讨论】:

  • 有什么问题?您的手势无法识别?为什么GestureLibrary 在某一点上是store 而在另一点上是gestureLib?无论如何,尝试也拨打store.load()
  • 抱歉,我一直在尝试各种代码示例来解决这个问题,我还没有“将此代码设为我自己的”,因此存在一些变量名称不一致。 store.load() 有效!有点儿。我运行了 Android Dev Sample Gesture Builder 并在该目录中存储了一个手势;问题是,识别代码识别来自示例构建器的手势,但不是我的应用用户创建的手势;所以存储机制仍然存在一些问题,我对这可能是什么感到困惑
  • 逻辑看起来不错。尝试发布您正在尝试的完整代码。
  • 尝试发布您正在尝试的完整代码。
  • 贴了完整的代码,有什么想法吗?

标签: android gesture gesture-recognition


【解决方案1】:

您的代码看起来不错。恐怕save() 需要一些时间,当您将其加载到新的Activity 中时,它尚未保存。 您可以使用单例类解决:

import java.io.File;

import android.content.Context;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;

public class PasswordGesturesLibrary {

    private static GestureLibrary sStore;

    public static GestureLibrary getStore(Context c) {

        if (sStore == null) {
            File storeFile = new File(c.getFilesDir(), "gestures");
            sStore = GestureLibraries.fromFile(storeFile);
            sStore.load();
        }

        return sStore;
    }

}

当您想引用该调用时:

GestureLibrary store = PasswordGesturesLibrary.getStore(this);

确保在两个活动中都使用它。

另外,看看sms templates with gestures 在 CyanogenMod 短信应用中的工作原理。

【讨论】:

  • 还是不行,问题肯定出在将手势提交到内存中,如果通过示例构建器在该目录中存在手势,则解释器可以毫无问题地识别它们。
  • 再次尝试了这个解决方案,换了一些其他的东西,它成功了!非常感谢,我已经有一段时间了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多