我在遵循手势教程时遇到了一个非常奇怪的问题: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,这很奇怪,因为它们相差一整个笔画。
对于长篇帖子感到抱歉 - 想要彻底。非常感谢任何建议,谢谢大家。
答案 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