¿Por qué mi sistema se superpone capturando todos los toques (no es posible interacción con la vista subyacente)

Tengo un servicio que inicia una superposición del sistema. Cuando la superposición es visible, quiero que sea tocable / detectar toques, pero quiero preservar la interacción con la pantalla detrás de ella (con detrás me refiero a la actividad subyacente, al lado de la superposición, por ejemplo).

Mi superposición es un mapa de bits / PNG de 128x128px. ¡Se dibuja y cuando hago clic en él, recibo el TOQUE! Log, que es bueno. Pero también cuando hago clic en cualquier otra parte de la pantalla (además de la superposición) me da el toque! Log y ninguna interacción con la pantalla debajo de ella es posible.

Aquí están las partes de mi código:

Actividad principal para iniciar el servicio

buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // start Service and return to Homescreen Intent i = new Intent(MainActivity.this, MyService.class); startService(i); Intent newActivity = new Intent(Intent.ACTION_MAIN); newActivity.addCategory(Intent.CATEGORY_HOME); newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(newActivity); } }); 

Servicio / Mostrar superposición

 @Override public int onStartCommand(Intent intent, int flags, int startId) { myOverlay = new Overlay(MyService.this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); params.gravity = Gravity.LEFT | Gravity.TOP; wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(myOverlay, params); myOverlay.setAnimation(new Waiting(MyService.this, 0, 0)); myOverlay.postInvalidate(); return super.onStartCommand(intent, flags, startId); } 

Cubrir

 public MyOverlay(Context context) { super(context); this.context = context; setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY()); return false; } }); } 

¿Qué estoy haciendo mal? También intentó WindowManager.LayoutParams.TYPE_PHONE en lugar de WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, pero el mismo comportamiento.

No estoy usando la bandera FLAG_WATCH_OUTSIDE_TOUCH, así que ¿por qué los toques no están registrados junto a la superposición?

EDITAR

Parece que he encontrado el problema, pero todavía no sé cómo resolverlo sin embargo … La imagen mostrada en la superposición es muy pequeña y no el problema, pero la superposición en sí es pantalla completa (!)

He añadido el siguiente registro al evento Overlay / onTouch ():

 Log.i("TOUCH!", "View: "+v.toString() +", size="+ v.getWidth()+"/"+v.getHeight()); 

Que luego me dice View: package.overlay.myOverlay, size = 480/762

Ahora he intentado forzarlo a no ser pantalla completa añadiendo la siguiente línea en el Servicio:

  @Override public int onStartCommand(Intent intent, int flags, int startId) { myOverlay = new Overlay(MyService.this); //HERE myOVerlay.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); params.gravity = Gravity.LEFT | Gravity.TOP; wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(myOverlay, params); myOverlay.setAnimation(new Waiting(MyService.this, 0, 0)); myOverlay.postInvalidate(); return super.onStartCommand(intent, flags, startId); } 

Pero no ayuda … todavía myOverlay tiene el tamaño de 480×762 … ¿Por qué es tan grande y cómo puedo conseguir que tenga el tamaño de la imagen contenida?

Esto funcionó para mí:

 WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.type = WindowManager.LayoutParams.TYPE_TOAST; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 

Utilice este LayoutParams al agregar la View al WindowManager , se le impide recibir los clics, es posible que TYPE_TOAST sea ​​suficiente, pero he añadido banderas sólo para asegurarse.

También tuve el mismo problema y arreglar el problema por establecer el params.width & params.height. Prueba esto.

 params.width = 128; params.height = 128; 

Espero que ayude.

Tuve el mismo problema, sólo intento agregar esto a tu código:

 WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY 

Estoy bastante seguro de que el código funcionará, si no sólo comprobar el código de algunos otros errores, pero en lo que respecta al tacto se refiere, esta es su solución. En cualquier caso, házmelo saber. Y casi olvidé la segunda parte, sólo cambia los atributos a matchparent en lugar de wrapcontent.

Buena suerte

  • ¿Cómo crear una superposición que bloquea los eventos de toque a la interfaz de usuario debajo de él?
  • Android: trazado de dibujo como superposición en MapView
  • Barra de navegación translúcida (Android 4.4) - Mostrar contenido debajo
  • Mi superposición no aparece hasta que se pulse mapView en android
  • Información sobre Android sobre superposiciones flotantes / elementos sobre otras aplicaciones
  • ¿Cómo mostrar una ruta entre dos geocoords en google maps?
  • ICS teclado de vuelta, los botones de inicio no tomar contacto cuando se abre en la superposición
  • ¿Cómo expandir el marcador de superposición en Google Maps?
  • Dibujar una superposición similar a MapsApp
  • Android cómo dibujar la pintura en mano libre en MapView con superposición?
  • Android ViewPager: fragmentos superpuestos cuando el ancho de página se establece en 90%
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.