我想GestureDetector
在我的NativeActivity
课堂上使用,但它似乎不起作用。可以GestureDetector
在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;
}
}
}
当我运行我的应用程序时,既不会onTouch()
,也onFling()
不会onDown()
被调用。我在这里遗漏了一些明显的东西还是不能使用GestureDetector
with NativeActivity
?
谢谢
编辑: 由于似乎不可能在 Java 端拦截 MotionEvents 在它们被传递到 C 端之前,我现在已经反过来尝试:每当我在 C 端获得 AINPUT_EVENT_TYPE_MOTION 时,我我通过 JNI 将其提供给 Java 端的 GestureDetector,如下所示:
(*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()。但是 onFling() 对我来说是最重要的。
我的怀疑是 onFling() 不起作用,因为它可能依赖于可以存储在 MotionEvent 中的历史值(每个 MotionEvent 都有一个带有历史参数的历史大小,请参阅 android/input.h)。但是,MotionEvent 类的 gain() 构造函数不允许我构造具有历史值的 MotionEvent 对象。
那么有什么方法可以将我在 C 端获得的真实 MotionEvent 提供给 Java 端的 onTouchEvent() 吗?我可以通过 NDK API 获取历史值,但 AFAICS 无法在 Java 端构造带有历史信息的 MotionEvent :-(
有任何想法吗?