我想知道像SwipePad和Wave Launcher这样的应用程序如何能够仅仅通过一项服务来检测触摸手势/事件。这些应用程序能够检测到触摸手势,即使它不在自己的活动中。我在互联网上找遍了,还没找到他们是怎么做到的。
我的主要问题是,服务如何监听触摸访客/事件,就像常规活动可能接收MotionEvents一样,即使它可能不在原始活动或上下文中。我本质上是在尝试构建一个应用程序,它将识别用户的特定触摸手势,而不管哪个活动在顶部,并在该手势被识别时执行某些操作。触摸识别将是一个在后台作为服务运行的线程。
发布于 2012-08-30 19:59:16
我也遇到了同样的问题,我终于解决了!感谢这篇文章:Creating a system overlay window (always on top)。您需要使用警告窗口而不是覆盖(这也意味着您可以在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);然后只需以这种方式附加一个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);耶!
发布于 2011-09-23 00:20:57
这个问题很有趣。我不知道他们是怎么做到的,我找到了谷歌群发的帖子,告诉我没有全球触控监听器。不过,我有个主意。
我发现了this post,其中有人成功地显示了一个来自服务的弹出窗口。如果我将弹出窗口设置为透明和全屏,我相信我可以捕捉到触摸,因为我被允许设置一个touch interceptor。
编辑:请报告结果,当您尝试时,如果知道这是否有效将是有趣的。
发布于 2015-08-28 22:54:29
我测试了所有可能的解决方案,但都不起作用,有些没有触发触控事件,但它们确实冻结了屏幕。
所以我做了一些逆向工程,现在发布了有效的解决方案
WindowManager.LayoutParams params = new android.view.WindowManager.LayoutParams(0, 0, 0, 0, 2003, 0x40028, -3);
View mView = new View(this);
mView.setOnTouchListener(this);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);https://stackoverflow.com/questions/6714020
复制相似问题