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 を取得するたびに、I'次のように、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 クラスの acquire() コンストラクターでは、過去の値を使用して MotionEvent オブジェクトを作成することはできません。
C 側で取得した実際の MotionEvent を Java 側の onTouchEvent() に供給する方法はありますか? NDK API を介して履歴値を取得できますが、AFAICS では、Java 側で履歴情報を使用して MotionEvent を構築することはできません :-(
何か案は?