我想在我的NativeActivity
類中使用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()簡單地d Oes this then:
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()對我來說是最重要的一個。
我suspection是onFling()不起作用,因爲它可能會依賴於可以存儲在一個MotionEvent歷史值 (每MotionEvent與歷史 參數的歷史尺寸,見的Android/input.h)。但是,MotionEvent類的gets()構造函數確實不允許我構造具有歷史值的MotionEvent對象,它不允許我使用 。
那麼有什麼辦法可以將我在C端獲得的真實MotionEvent提供給Java端的 上的onTouchEvent()嗎?我可以通過NDK API獲得歷史價值,但AFAICS是不可能 構建MotionEvent與Java方面的歷史信息:-(
任何想法?
感謝您的回覆。我應該提到我已經嘗試覆蓋NativeActivity的onTouchEvent()。儘管Android文檔說NativeActivity從Activity類繼承了onTouchEvent()方法,但它永遠不會被調用。所以不幸的是,這是不行的:/ – Andreas 2013-03-01 20:51:16
對此我很抱歉。我也只會評論你的問題,但我的聲譽還不允許。不幸的是,我不熟悉C/C++,但是你看看[onInputQueueCreated](http://developer.android.com/reference/android/app/NativeActivity.html#onInputQueueCreated(android.view.InputQueue ))? – Griddo 2013-03-01 21:10:19
嗯,你認爲可以在onInputQueueCreated()幫助這裏?我不知何故需要找到一種方法來攔截所有的觸摸事件,將它們轉發給GestureDetector。我沒有看到onInputQueueCreated()如何在這裏幫助... – Andreas 2013-03-01 21:20:16