Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the View that is receiving all the touch events

I have a system overlay that sits above all Activities and Windows. The only problem is that it can only detect MotionEvents when a user places his/her down on the screen (it can't track the finger's movements or detects when the finger is lifted). As a possible solution, I've implemented a second view (I'll call it the tracking view) that is able to handle all the touch events, but stays hidden until a touch in the desired location is detected by the system overlay; in that event, it will bring up the tracking view. Only problem is, that the tracking view doesn't start detecting touch events until the user places his/her finger back down on the screen. So to resolve this, I want to intercept the view that's getting the touch events (which is the view beneath the system overlay) and forward all its touch events to the tracking view to process.

Does anyone know how I can get the view that's receiving all the touch events and redirect all the touch events it's receiving?

This question refers to the examples used in this question.

like image 211
Brian Avatar asked Jul 19 '11 04:07

Brian


1 Answers

You can't do exactly what you are asking. The input system is very careful to restrict what windows can receive what events; it is deliberately not like other systems such as Microsoft Windows where you can get involved in the low-level event dispatching and see everything going on. The only things allowed are:

  • A window that can receive all events that would go to it or any windows behind it (without allowing those events to be received by the windows behind it). This is called "touch modal".
  • A window that can receive all events within its rectangle without letting those go to windows behind it, but events outside of the rectangle are allowed to go to the appropriate window behind it without being seen by it. This is called "not touch modal".
  • A variation on "not touch modal" that allows it to be told about only the down event that happens outside of its window. It will not receive any other further events, however, and is delivered as a special action code: http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_OUTSIDE

A further core rule of event dispatching to windows is that once a window is selected as the target of the touch event, it will continue to receive the event stream until the final up. Traditionally in Android this would apply to all further fingers of the touch gesture (it receives all fingers, no matter where they appear, until the last finger goes up). More recent versions of the platform allow you to modify this behavior to be multi-touch aware: http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SPLIT_TOUCH

So those are the tools you have in your tool box. You can build the things that are possible with them, but this is not intended to allow you to do any possible kind of interaction with the event system, so there are going to be limits.

like image 159
hackbod Avatar answered Oct 01 '22 09:10

hackbod