【问题标题】:GestureDetector inside NativeActivityNativeActivity 中的 GestureDetector
【发布时间】:2013-03-01 16:03:42
【问题描述】:

我想在我的NativeActivity 类中使用GestureDetector,但它似乎不起作用。是否可以在NativeActivity 应用程序中使用GestureDetector?我的代码是这样的:

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 类的 gain() 构造函数确实 不允许我用历史值构造 MotionEvent 对象。

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

有什么想法吗?

【问题讨论】:

  • 让我们快进 7 年。你解决了吗?
  • 不,我不再使用NativeActivity,因为它对于我的目的来说太有限了。

标签: java android android-ndk gesture


【解决方案1】:

没有测试过这个,我不熟悉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 是如何工作的......

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

【讨论】:

  • 感谢您的回复。我应该提到我已经尝试覆盖我的 NativeActivity 的 onTouchEvent()。尽管 Android 文档说 NativeActivity 继承了 Activity 类的 onTouchEvent() 方法,但它也从未被调用过。所以不幸的是,这也没有办法:/
  • 对此我很抱歉。我也只会评论您的问题,但我的声誉还不允许这样做。不幸的是,我也不熟悉 C/C++,但你看过onInputQueueCreated吗?
  • 嗯,你认为 onInputQueueCreated() 在这里有什么帮助?我不知何故需要找到一种方法来拦截所有触摸事件以将它们转发到 GestureDetector。我不明白 onInputQueueCreated() 在这里有什么帮助......
  • 我不知道,这听起来像是编程级别之间的桥梁。但是在阅读了更多 Google-Hits 和 SO-Questions 之后,恐怕您必须在底层本机代码中捕获输入事件,因为它们会立即传递给它。但正如我已经说过的,我只是在黑暗中拍摄:(
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2013-12-20
  • 2014-07-07
  • 2018-09-23
  • 1970-01-01
  • 2015-04-14
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多