我想在我的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与NativeActivity结合使用?
谢谢
编辑:--因为在将它们传递给C端之前不可能拦截Java端的MotionEvents,现在我尝试了相反的方法:每当我在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类的not ()构造函数不允许我构造具有历史值的MotionEvent对象。
那么,是否有任何方式将我在C端获得的真实MotionEvent提供给onTouchEvent()呢?我可以通过NDK获得历史值,但是AFAICS不可能用MotionEvent端的历史信息构造一个:-(
有什么想法吗?
发布于 2013-03-01 20:18:58
我做了没有测试,我也不熟悉NativeActivity,但据我所见,您没有连接到您的GestureDetector。
与其创建OnTouchListener,不如尝试覆盖活动的onTouchEvent(MotionEvent event)
@Override
public boolean onTouchEvent (MotionEvent event) {
Log.i("DEBUG", "*** TOUCH VIEW ***");
return mGestureDetector.onTouchEvent(event);
}这将传递您活动中的每个MotionEvent到您的GestureDetector。如果只想捕获特定视图上的MotionEvents,可以将OnTouchListener附加到该视图:
findViewById(R.id.yourView).setOnTouchListener(mGestureListener);正如我已经说过的,这可能只适用于正常的活动,我不知道NativeActivities是如何工作的.
不管怎样,我希望这能帮上忙。
https://stackoverflow.com/questions/15161857
复制相似问题