1

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()。ここで明らかな何かが欠けていますか、それとも使用できませんGestureDetectorNativeActivity?

ありがとう

編集: 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 を構築することはできません :-(

何か案は?

4

1 に答える 1

0

私はこれをテストしていませんNativeActivityし、よく知りませんが、私が見る限り、あなたはあなたのGestureDetector.
を作成する代わりにOnTouchListener、アクティビティの をオーバーライドしてみてくださいonTouchEvent(MotionEvent event):

@Override
public boolean onTouchEvent (MotionEvent event) {
    Log.i("DEBUG", "*** TOUCH VIEW ***");
    return mGestureDetector.onTouchEvent(event);
}

これにより、Activity のすべての MotionEvent が GestureDetector に渡されます。特定のビューで MotionEvents のみをキャッチしたい場合は、OnTouchListener をそれにアタッチできます。

findViewById(R.id.yourView).setOnTouchListener(mGestureListener);

すでに述べたように、これは通常のアクティビティにのみ適用される可能性があり、NativeActivities がどのように機能するかはわかりません...

とにかく、これが役立つことを願っています。

于 2013-03-01T20:18:58.020 に答える