Java 本机活动中的手势检测器
我想在我的NativeActivity类中使用手势检测器,但它似乎不起作用。是否可以在NativeActivity应用程序中使用手势检测器?我的代码如下: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; @
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了,因为它对我的目的来说太有限了。