Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can a service listen for touch gestures/events?

I'm wondering how apps like SwipePad and Wave Launcher are able to detect touch gestures/events simply through a service. These apps are able to detect a touch gestures even though it is not in their own Activity. I've looked all over the Internet and haven't found how they can do that.

My main question is how a service can listen in on touch guestures/events just as a regular Activity may receive MotionEvents even though it may not be in the original Activity or context. I'm essentially trying a build an app that will recongize a particular touch gesture from a user regardless which Activity is on top and do something when that gesture is recongized. The touch recongition will be a thread running in the background as a service.

like image 299
Brian Avatar asked Jul 15 '11 22:07

Brian


1 Answers

I had this same problem and I've finally figured it out! Thanks to this post: Creating a system overlay window (always on top). You need to use an alert window instead of an overlay (and this also means you can use it in 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); 

Then just attach a GestureListener in this manner:

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); 

Yay!

like image 116
pypmannetjies Avatar answered Sep 21 '22 07:09

pypmannetjies