服务如何监听触摸手势/事件?

Bri*_*ian 60 service events android touch gesture

我想知道像SwipePad和Wave Launcher这样的应用程序是如何通过服务来检测触摸手势/事件的.这些应用程序能够检测到触摸手势,即使它不在自己的活动中.我看过整个互联网,但没有找到他们如何做到这一点.

我的主要问题是服务如何监听触摸客户/事件,就像常规活动可能会收到MotionEvents一样,即使它可能不在原始活动或上下文中.我本质上是在尝试构建一个应用程序,该应用程序将从用户处重新识别特定的触摸手势,无论哪个Activity位于顶部,并在该手势被识别时执行某些操作.触摸识别将是在后台作为服务运行的线程.

pyp*_*ies 18

我有同样的问题,我终于搞清楚了!感谢这篇文章:创建系统覆盖窗口(始终在顶部).您需要使用警报窗口而不是叠加层(这也意味着您可以在Andoid ICS中使用它):

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)

然后以这种方式附加一个GestureListener:

GestureDetector gestureDetector = new GestureDetector(this, new AwesomeGestureListener());
View.OnTouchListener gestureListener = new View.OnTouchListener() {
      public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
      }
};

overlayView.setOnTouchListener(gestureListener);
Run Code Online (Sandbox Code Playgroud)

好极了!

  • 不是一个好的答案,因为它会阻止所有其他运行的应用 (5认同)
  • 我正在尝试从服务中窃听,服务附带一个Activity.该活动照常使用,但服务保持记录点击.当使用TYPE_SYSTEM_OVERLAY时,它在Android 2.3上工作得很好,但在4.1上没有调用onTouchEvent.使用TYPE_SYSTEM_ALERT时,会调用onTouchEvent,但触摸事件不会传递给活动,并且无法响应.请帮忙 (3认同)
  • 这适用于Android 4.3,但触摸事件由服务使用,使手机大部分无法使用. (2认同)

Kni*_*edi 5

有趣的问题.我不知道他们是怎么做到的,我发现谷歌小组的帖子告诉我没有全球性的触摸倾听者.但无论如何我有一个想法......

我发现这篇帖子有人成功地从服务中显示一个弹出窗口.如果我将弹出窗口设置为透明和全屏,我确信我可以捕获触摸,因为我被允许设置触摸拦截器.

编辑:请在尝试时报告结果,知道这是否有效会很有趣...