【发布时间】: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