Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 本机活动中的手势检测器_Java_Android_Android Ndk_Gesture - Fatal编程技术网

Java 本机活动中的手势检测器

Java 本机活动中的手势检测器,java,android,android-ndk,gesture,Java,Android,Android Ndk,Gesture,我想在我的NativeActivity类中使用手势检测器,但它似乎不起作用。是否可以在NativeActivity应用程序中使用手势检测器?我的代码如下: public class HollywoodActivity extends android.app.NativeActivity { private GestureDetector mGestureDetector; private View.OnTouchListener mGestureListener; @

我想在我的NativeActivity类中使用手势检测器,但它似乎不起作用。是否可以在NativeActivity应用程序中使用手势检测器?我的代码如下:

public class HollywoodActivity extends android.app.NativeActivity {

    private GestureDetector mGestureDetector;
    private View.OnTouchListener mGestureListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            mGestureDetector = new GestureDetector(new MyGestureDetector());
            mGestureListener = new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    Log.i("DEBUG", "*** TOUCH VIEW ***");
                    return mGestureDetector.onTouchEvent(event);
                }
            };                                  
    }

    private class MyGestureDetector extends SimpleOnGestureListener {

          @Override
          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

              Log.i("DEBUG", "FLING" + velocityX + " " + velocityY);
              return true;
          }

          @Override
          public boolean onDown(MotionEvent e) {
              Log.i("DEBUG", "ON DOWN");
              return true;
          }         
    }
}
(*env)->CallVoidMethod(env, g_android->activity->clazz, (*env)->GetMethodID(env, globalMyNativeActivityClass, "runGestureDetector", "(JJIIFFFFIFFII)V"), AMotionEvent_getDownTime(event), AMotionEvent_getEventTime(event), AMotionEvent_getAction(event), AMotionEvent_getPointerCount(event), AMotionEvent_getRawX(event, 0), AMotionEvent_getRawY(event, 0), AMotionEvent_getPressure(event, 0), AMotionEvent_getSize(event, 0), AMotionEvent_getMetaState(event), AMotionEvent_getXPrecision(event), AMotionEvent_getYPrecision(event), AInputEvent_getDeviceId(event), AMotionEvent_getEdgeFlags(event));
当我运行我的应用程序时,onTouch、onFling和onDown都不会被调用。我是否遗漏了一些明显的东西,或者无法将手势检测器与本机活动一起使用

谢谢

编辑: 因为之前似乎不可能在Java端截获MotionEvents 它们被传递到C端,我现在尝试了另一种方式:每当我 在C端获得一个AINPUT\u事件\u类型\u运动,我将其输入手势检测器 在Java端,通过JNI,如下所示:

public class HollywoodActivity extends android.app.NativeActivity {

    private GestureDetector mGestureDetector;
    private View.OnTouchListener mGestureListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            mGestureDetector = new GestureDetector(new MyGestureDetector());
            mGestureListener = new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    Log.i("DEBUG", "*** TOUCH VIEW ***");
                    return mGestureDetector.onTouchEvent(event);
                }
            };                                  
    }

    private class MyGestureDetector extends SimpleOnGestureListener {

          @Override
          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

              Log.i("DEBUG", "FLING" + velocityX + " " + velocityY);
              return true;
          }

          @Override
          public boolean onDown(MotionEvent e) {
              Log.i("DEBUG", "ON DOWN");
              return true;
          }         
    }
}
(*env)->CallVoidMethod(env, g_android->activity->clazz, (*env)->GetMethodID(env, globalMyNativeActivityClass, "runGestureDetector", "(JJIIFFFFIFFII)V"), AMotionEvent_getDownTime(event), AMotionEvent_getEventTime(event), AMotionEvent_getAction(event), AMotionEvent_getPointerCount(event), AMotionEvent_getRawX(event, 0), AMotionEvent_getRawY(event, 0), AMotionEvent_getPressure(event, 0), AMotionEvent_getSize(event, 0), AMotionEvent_getMetaState(event), AMotionEvent_getXPrecision(event), AMotionEvent_getYPrecision(event), AInputEvent_getDeviceId(event), AMotionEvent_getEdgeFlags(event));
Java方法runGestureDetector就是这样做的:

public void runGestureDetector(long downTime, long eventTime, int action, int pointerCount, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags) {

    mGestureDetector.onTouchEvent(MotionEvent.obtain(downTime, eventTime, action, pointerCount, x, y, pressure, size, metaState, xPrecision, yPrecision, deviceId, edgeFlags));             
}
通过这样做,我能够察觉到一些手势。onDown、onSingleTap和onScroll 进来吧。然而,不起作用的是正在进行的。但昂弗林是最重要的 对我来说很重要

我怀疑onFling不起作用,因为它可能依赖于历史价值 可以存储在MotionEvent中的每个MotionEvent都有一个历史大小和历史大小 参数,请参见android/input.h。但是,MotionEvent类的获取构造函数 不允许我用历史值构造MotionEvent对象

那么,有没有任何方法可以将我在C端得到的真实MotionEvent提供给onTouchEvent Java方面?我可以通过NDK API获得历史值,但AFAICS这是不可能的 要在Java端使用历史信息构建MotionEvent,请执行以下操作:-

有什么想法吗?

我没有测试这个,而且我对本土活动不熟悉,但据我所知,你没有连接手势检测器。 不要创建OnTouchListener,而是尝试覆盖活动的onTouchEventMotionEvent事件:

这将把你活动中的每个动作事件传递给你的手势检测器。如果要仅捕获特定视图上的MotionEvents,可以将OnTouchListener附加到该视图:

findViewById(R.id.yourView).setOnTouchListener(mGestureListener);
就像我已经说过的,这可能只适用于正常的活动,我不知道本土活动是如何运作的


无论如何,我希望这能有所帮助。

谢谢你的回复。我应该提到的是,我已经试图超越我的本土活动。尽管Android文档说NativeActivity从Activity类继承了onTouchEvent方法,但它也从未被调用过。所以不幸的是,这也不可能。对此我很抱歉。我也想对你的问题发表评论,但我的名声还不允许这样做。不幸的是,我对C/C++也不太熟悉,但是你看了吗?嗯,你认为在这里如何输入帮助?我需要找到一种截取所有触摸事件的方法,将它们转发给手势检测器。我不知道onInputQueueCreated在这里有什么帮助……我不知道,它听起来就像是编程级别之间的桥梁。但是在阅读了更多的Google点击之后,我担心您必须在底层本机代码中捕获输入事件,因为它们会立即传递给它。但正如我已经说过的,我只是在黑暗中拍摄:让我们快进7年。你解决了吗?不,我不再使用NativeActivity了,因为它对我的目的来说太有限了。