fromhtml example android touch overlay touch-event

html fromhtml android example



SuperposiciĆ³n de Android para agarrar TODO toque, y pasarlos? (4)

Básicamente estoy tratando de obtener todos los datos de eventos táctiles de algo así como una superposición del sistema, mover mis sprites en función de estos datos táctiles, luego permitir que el sistema operativo / pantalla de inicio / navegador actúe sobre los datos como debería (o viceversa). He encontrado preguntas similares, pero nada que me lleve a ninguna parte donde no haya estado:

Obtención de 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 Coger TODOS los eventos táctiles y actuar sobre ellos moviendo mis sprites y no permitir que el sistema operativo / pantalla de inicio / navegador los vea, O bien, puedo permitir que pasen los eventos táctiles y solo obtengo un "TOUCH_OUTSIDE" para Mi aplicación para actuar.

Mi objetivo no cumplido:

NO PUEDO por mi vida encontrar una manera de conseguir que AMBOS trabaje con los datos. Los únicos métodos en los que puedo pensar, que no puedo implementar, son: Interceptar los datos en mi aplicación y pasarlos a OS / homecreen / browser para que funcionen con Permitir que OS / homescreen / browser obtenga los datos primero, y luego obtener una devolución de llamada con información de alguna manera Permitiendo que el sistema operativo / pantalla de inicio / navegador obtenga los datos, actúe sobre los datos y los encueste para determinar cuáles son sus valores de desplazamiento / ubicación para que actúen sobre ellos en mi APP.

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

(Para evitar confusiones, no quiero decir que tenga dos vistas. Quiero decir que tengo una vista controlada a través de la actividad / servicio que cubre el sistema operativo / pantalla de inicio / navegador. Como un panel de vidrio, si lo desea).

¡Gracias por cualquier información útil que pueda ofrecer, es muy apreciado!

[ACTUALIZACIÓN] Publiqué mi propia documentación sobre el asunto a continuación, para no ser confuso.


Encontré esta documentación que prácticamente indica que no es posible hacer ambas cosas: Android: Multi touch y TYPE_SYSTEM_OVERLAY

Discuten soluciones alternativas, pero no creo que ninguna de ellas realmente funcione exactamente para lo que estoy tratando de hacer. Ambos dieron los eventos a la aplicación subyacente, y pudiendo espiarlos para que actúen 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 la bandera FLAG_WATCH_OUTSIDE_TOUCH. Esto presenta un problema porque, como indica la documentación de Android: "no recibirá el gesto completo hacia abajo / mover / subir, solo la ubicación del primer down como ACTION_OUTSIDE". Para recibir la gama completa de eventos táctiles, debe usar el tipo TYPE_SYSTEM_ALERT, pero esto hace que la superposición se haga cargo de la pantalla y detenga la interacción con otros elementos.

Cualquiera quiere estar en desacuerdo. Me encantaría escuchar buenas noticias :-D


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

public class bleh extends Service { public void onCteqwer(int i) { Context context; Class <bleh> 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); } }


Estaba buscando lo mismo.

Esta bandera hace el truco para mí FLAG_NOT_TOUCH_MODAL

Funciona en la configuración de Android 7 y 8 de la siguiente manera.

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

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

Por cierto, Google Maps hace un muy buen trabajo con esto en Android 8. Puedes arrastrar su ventana de superposición, cambiar su tamaño 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)