Android SDK - 使用Gesture API,希望手势在被识别后留在屏幕上

scr*_*yne 6 android gesture-recognition

我正在使用Gesture API和我创建的手势库,它运行得非常好.问题是我想在OnGesturePerformedListener退出后在屏幕上显示手势,而是删除手势.我想在OnGesturePerformedListener之后可能有一个事件 - 我可以在OnGesturePerformedListener中保存手势,然后在以后的事件中再次显示它.有谁知道是否有这样的事件?这是代码:

   private OnGesturePerformedListener handleGestureListener = new OnGesturePerformedListener() {
        @Override
        public void onGesturePerformed(GestureOverlayView gestureView,
                                       Gesture gesture) {
            if (gesture.getStrokesCount() != 2){
                setWonderEmoticon();
                return;
            }
            ArrayList<Prediction> predictions = gLib.recognize(gesture);
            // one prediction needed
            if (predictions.size() > 0) {
                Prediction prediction = predictions.get(0);
                // checking prediction
                if (prediction.score > 20.0) {
                    setHappyEmoticon();
                }
                else {
                    setWonderEmoticon();
                }
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

顺便说一句,当从代码中删除setWonderEmoticon()和setHappyEmoticon()时,会发生同样的事情.

Dar*_* M. 1

这是一个可以很好地使用的示例OnGesturePerformedListener

MainActivity.java

// ...

public class MainActivity extends AppCompatActivity implements GestureOverlayView.OnGesturePerformedListener, GestureOverlayView.OnGestureListener {

    GestureOverlayView mGestureView;
    ImageView mImageView;
    TextView mText;
    Paint mPaint;
    Bitmap mBitmap;
    Canvas mCanvas;
    GestureLibrary mGestureLib;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mImageView = (ImageView) findViewById(R.id.image_view);
        mGestureView = (GestureOverlayView) findViewById(R.id.gesture_overlay);
        mGestureView.addOnGesturePerformedListener(this);
        mGestureView.addOnGestureListener(this);

        mGestureView.setGestureColor(Color.BLACK);
        mGestureView.setUncertainGestureColor(Color.BLACK);
        mGestureView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onGlobalLayout() {
                mGestureView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                mBitmap = Bitmap.createBitmap(mGestureView.getWidth(), mGestureView.getHeight(), Bitmap.Config.ARGB_8888);
                mCanvas = new Canvas(mBitmap);
            }
        });

        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(12.0f);
        mPaint.setColor(Color.GRAY);

        mText = (TextView) findViewById(R.id.text);

        mGestureLib = GestureLibraries.fromRawResource(getApplicationContext(), R.raw.gesture);
        mGestureLib.load();
    }

    @Override
    public void onGesturePerformed(GestureOverlayView gestureOverlayView, Gesture gesture) {
        if (gesture.getStrokesCount() > 0) {
            ArrayList<Prediction> predictions = mGestureLib.recognize(gesture);
            for (GestureStroke stroke : gesture.getStrokes()) {
                Path path = stroke.getPath();
                mCanvas.drawPath(path, mPaint);
            }
            mImageView.setImageBitmap(mBitmap);
            if (!predictions.isEmpty()) {
                Prediction best = predictions.get(0);
                mText.setText(String.format("Gesture: %s", best.name));
            }
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

Activity_main.xml快照):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="onl.nok.gestures.MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Waiting ..."
        android:textSize="25sp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/image_view" />

    <android.gesture.GestureOverlayView
        android:id="@+id/gesture_overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gestureStrokeType="single"
        android:fadeEnabled="false" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

如何应用新手势?

  1. 使用 Android 应用程序Gesture Builder跟踪手势
  2. 在您的项目中创建一个资源文件夹raw<Project>/app/src/main/res/raw/
  3. 从您的设备复制生成的文件gesture.txt/Android/data/pack.GestureApp/files/gesture.txt
  4. 最后将其粘贴到创建的文件夹中raw<Project>/app/src/main/res/raw/gesture.txt

最后我将源码推送到了GitHub:https ://github.com/nok/android-gesture-libraries


第二次编辑

你说得对。所以我用一个简单的方法ImageView来绘制所执行的手势。此外,您可以更改PaintmPaint类型的样式。您可以在 GitHub 上推送的提交82eabfb5ce427d中找到所有更改。