NativeActivity中的GestureDetector

时间:2013-03-01 16:03:42

标签: java android android-ndk gesture

我想在我的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无法使用吗?

由于

修改 因为之前似乎不可能在Java端拦截MotionEvents 他们被传递到C方面,我现在已经尝试了反过来:每当我 在C端获得AINPUT_EVENT_TYPE_MOTION,我将其提供给GestureDetector 在Java端通过JNI这样:

(*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类的gets()构造函数可以 不允许我构造具有历史值的MotionEvent对象。

那么有什么方法可以将我在C端获得的真实MotionEvent提供给onTouchEvent() Java方面?我可以通过NDK API获取历史值,但AFAICS是不可能的 使用Java端的历史信息构造一个MotionEvent: - (

有什么想法吗?

1 个答案:

答案 0 :(得分: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如何运作......

无论如何,我希望这有帮助。