叠加应用程序仅对某些触摸事件作出反应

我目前正在深入研究Android开发,最近遇到了困难。 我想创建一个覆盖应用程序,它位于所有其他应用程序之上。 它应该监听三指滑动,而所有其他触摸事件应该由OS处理(例如底层应用程序)。

这有可能吗?

我已经发现我需要添加LayoutParam TYPE_PHONE而不是SYSTEM_ALERT,因为后者将消耗所有触摸事件。 所以我的课现在看起来像这样:

package [...] public class Overlay extends Service { private TView mView; private ThreeFingerSwipeDetector detector = new ThreeFingerSwipeDetector() { @Override public void onThreeFingerTap() { Toast.makeText(getBaseContext(), "Three Fingers recognized.", Toast.LENGTH_SHORT).show(); } }; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Toast.makeText(getBaseContext(), "Launched! :-)", Toast.LENGTH_SHORT).show(); mView = new TView(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, // PHONE, because SYSTEM_ALERT will consume _ALL_ touch events WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.RIGHT | Gravity.TOP; WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(mView, params); } @Override public void onDestroy() { WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.removeView(mView); mView = null; super.onDestroy(); } // inner class class TView extends ViewGroup { public TView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { } @Override public boolean onTouchEvent(MotionEvent event) { if(detector.onTouchEvent(event)) { return true; } //TODO: what am I supposed to do when it's not a 3 finger swipe (aka the detector doesn't recognize it as one) // something like super.onInterceptTouchEvent(event) or so? } } } 

检测器将正确检测3指滑动,但我的应用程序处于当前状态将阻止所有其他用户与底层UI的交互,直到我杀死应用程序。

是否有可以使用MotionEvent作为参数调用的系统调用,其中我的TODO注释现在是? 或者我想要一些不可能的东西?

致以诚挚的问候,非常感谢!

编辑 :ThreeFingerSwipeDetector类如下所示:

 [Import, ...] public abstract class ThreeFingerSwipeDetector { public boolean onTouchEvent(MotionEvent event) { int t = event.getActionMasked(); switch(event.getActionMasked()) { case MotionEvent.ACTION_POINTER_DOWN: if(event.getPointerCount() == 3) onThreeFingerTap(); return true; case MotionEvent.ACTION_DOWN: if(event.getPointerCount() == 3) { onThreeFingerTap(); return true; } } return false; } public abstract void onThreeFingerTap(); } 

实际上它不是一个刷卡识别器,但它现在只检查三个手指点击。 无论如何,那里的逻辑应该是完全相同的。

我会回答我自己的问题:这根本不可能。 根据此文章和Android文档,您可以使用所有触摸事件,也可以从版本4.0.3开始不使用任何触摸事件。 因此,不可能只处理一些触摸事件并让其他人通过叠加层。