Superposición de Android para agarrar TODO tacto, y pasarlos?

Básicamente estoy tratando de obtener todos los datos de eventos táctiles de una superposición del sistema, mover mis sprites en función de estos datos táctiles y luego permitir que OS / homescreen / browser actúe sobre los datos como debería (o viceversa). He encontrado preguntas similares, pero nada que me lleve a ningún lugar donde no haya estado ya:

Obtener la vista que está recibiendo todos los eventos táctiles

(Implementado, con los resultados a continuación) Creación de una ventana de superposición del sistema (siempre en la parte superior)

Que puedo hacer:

Puedo capturar TODOS los eventos táctiles y actuar sobre ellos moviendo mis sprites y no permitir que OS / homescreen / browser vea ninguno de ellos, O BIEN puedo permitir que los eventos táctiles pasen y solo obtener un “TOUCH_OUTSIDE” para mi aplicación para actuar.

Mi objective inalcanzable:

NO PUEDO, por mi propia vida, encontrar la forma de que AMBOS trabajen con los datos. Los únicos métodos que puedo pensar, que no me pueden implementar son: Interceptar los datos en mi aplicación y pasarlos a OS / pantalla de inicio / navegador para trabajar con Permitir que OS / homescreen / browser obtenga los datos primero, y luego recibiendo de alguna manera una callback con información Permitiendo que OS / homescreen / browser obtenga los datos, actúe en base a los datos y los sondee para conocer sus valores de desplazamiento / ubicación para actuar en mi APP.

Me temo que esto simplemente no es posible, creo que leí en algún lugar de alguna documentación que no puedo encontrar ahora: “Es todo o nada, o tu vista obtiene todos los eventos, o ninguno”

(Para evitar confusiones, no quiero decir que tengo dos puntos de vista. Quiero decir, tengo una vista controlada a través de actividad / servicio que se superpone al sistema operativo / pantalla de inicio / navegador. Como si fuera un panel de cristal).

¡Gracias por toda la información útil que puede ofrecer, es muy apreciada!

[ACTUALIZAR] Publiqué mi propia documentación sobre el tema a continuación, para no confundir.

Encontré esta documentación que prácticamente dice que no es posible hacer ambas cosas: Android: toque múltiple y TYPE_SYSTEM_OVERLAY

Discuten las soluciones, pero no creo que ninguna de ellas funcione exactamente para lo que estoy tratando de hacer. Ambos dieron los eventos a la aplicación subyacente, y pudiendo espiarlos para actuar sobre ellos por mí mismo.

Para crear una vista de superposición, al configurar los LayoutParams, debe establecer el tipo en TYPE_SYSTEM_OVERLAY y usar el indicador FLAG_WATCH_OUTSIDE_TOUCH. Esto presenta un problema porque, como indica la documentación de Android, “no recibirás el gesto completo de abajo / mover / subir, solo la ubicación del primer down como ACTION_OUTSIDE”. Para recibir toda la gama de eventos táctiles, necesita usar el tipo TYPE_SYSTEM_ALERT, pero esto hace que la superposición tome el control de la pantalla y detenga la interacción con otros elementos.

Alguien quiere estar en desacuerdo Me encantaría escuchar buenas noticias 😀

Puede utilizar GestureOverlayView; si desea ocultar las líneas que dibuja, puede establecer el color en Transparente # 00000000 para que no aparezca, y luego puede capturar todos los toques y gestos.

http://developer.android.com/resources/articles/gestures.html

Estaba buscando lo mismo.

Esta bandera me convence FLAG_NOT_TOUCH_MODAL

Funciona en la configuración de Android 7 y 8 como se muestra a continuación.

La única acción que he implementado hasta ahora es un toque para cerrar la ventana de superposición.

También utilicé el código de aquí Ejemplo de código de superposición de sistema en Github que se necesitaba para obtener los eventos.

Por cierto, Google Maps hace un trabajo realmente bueno con esto en Android 8. Puede arrastrar su ventana de superposición, redimensionarla o cerrarla. Y todas las demás aplicaciones funcionan bien mientras está funcionando.

var type = 0 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY } var flags = FLAG_NOT_TOUCH_MODAL mOverlayLayoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, type, flags, PixelFormat.TRANSLUCENT) 

Esta no es la solución óptima, pero funciona. Reinicie el servicio alternar la bandera que no se puede tocar. ponga boolean extra en Intent que se usa para iniciar el servicio para determinar el valor de alternancia de estado anterior. Una mejor implementación sería disparar la intención al tacto cuando la ventana está escuchando y después de un período fijo cuando no se está escuchando.

 public class bleh extends Service { public void onCteqwer(int i) { Context context; Class  context1 = bleh.class; WindowManager.LayoutParams params = null; WindowManager mang = (WindowManager) getSystemService(WINDOW_SERVICE); //check previous state of service if(i==0) params = new WindowManager.LayoutParams(arg0,arg1,arg2,arg3,arg4,arg5); if(i==1) params = new WindowManager.LayoutParams (WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,arg0,arg1,arg2,arg3,arg4); LayoutInflater inflater = (LayoutInflater) getSystemService (LAYOUT_INFLATER_SERVICE); View mViw = inflater.inflate(arg, null); mViw.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); mang.addView(mViw, params); Intent z = new Intent(context, context1); if(i==0) z.putExtra("name", 1); if(i==1) z.putExtra("name", 0); stopSelf(); startService(z); } @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Bundle i=intent.getExtras(); int userName = 0; if (i != null) { userName = i.getInt("name"); onCteqwer(userName); } }