Per creare una vista sovrapposizione, quando si imposta LayoutParams
è necessario impostare il tipo su TYPE_SYSTEM_OVERLAY
e utilizzare la bandiera FLAG_WATCH_OUTSIDE_TOUCH
. Questo presenta un problema, perché la documentazione Android afferma:
non sarà possibile ricevere il pieno giù/spostare/alto gesto, solo la posizione del primo verso il basso come un ACTION_OUTSIDE
.
Al fine di ricevere la gamma completa di eventi touch è necessario utilizzare il tipo TYPE_SYSTEM_ALERT
, ma questo fa sì che la sovrapposizione di prendere in consegna lo schermo e fermare l'interazione con altri elementi. La soluzione è utilizzare sia TYPE_SYSTEM_OVERLAY
e TYPE_SYSTEM_ALERT
e passare da una all'altra cambiando il tipo di LayoutParams
secondo necessità.
Questo si ottiene:
- Guarda per l'evento
ACTION_OUTSIDE
movimento.
- Quando si verifica, verificare se si è verificato all'interno della sovrapposizione.
- Se così fosse, cambiare il tipo di
LayoutParams
-TYPE_SYSTEM_ALERT
- Una volta che l'interazione con la sovrapposizione è completa, tornare a
TYPE_SYSTEM_OVERLAY
- Ripetere
L'unica cosa da tenere a mente è che il ACTION_OUTSIDE
l'evento di movimento viene sempre trasmesso al resto degli elementi sullo schermo. Quindi, ad esempio, se l'overlay si trova sopra un pulsante, quel pulsante riceverà anche l'evento di movimento e non c'è modo di fermarlo.
Assicurarsi inoltre di aggiungere l'autorizzazione SYSTEM_ALERT_WINDOW
al file principale.
ho postato la soluzione completa qui:
http://www.jawsware.mobi/code_OverlayView/(Aggiornato)
Esso include tutto il codice sorgente e un link per scaricare l'intero progetto di esempio.
aggiornamento per Android 4.0 - 1/3/2013
Per creare una vista di sovrapposizione, quando si imposta il LayoutParams Non impostare il tipo di TYPE_SYSTEM_OVERLAY
.
Impostare invece su TYPE_PHONE
.
usa quanto segue:
FLAG_NOT_TOUCH_MODAL
FLAG_WATCH_OUTSIDE_TOUCH
FLAG_NOT_TOUCH_MODAL
< < ho trovato questo per essere molto importante. Senza di esso, la messa a fuoco è assegnata alla sovrapposizione e al tasto di accesso rapido (casa, menu, ecc.) Le presse non vengono passate all'attività sottostante.
Inoltre, il collegamento precedente (sopra) è stato aggiornato per riflettere questo aggiornamento.
Grazie per l'aggiornamento Jawsware. Ma con la tua logica anche io non sono in grado di vedere più eventi touch sull'overlay. Voglio dire se si mantiene il primo dito sullo schermo e poi il secondo e poi il terzo (senza sollevare quelli precedenti), dovremmo essere in grado di ricevere gli eventi di tocco (ad esempio, onTouch() dovrebbe essere chiamato). È possibile comunque? – Ravs
Non riceverai informazioni multi-touch mentre si trova nello stato 'TYPE_SYSTEM_OVERLAY'. Una volta che si passa a 'TYPE_SYSTEM_ALERT' (vale a dire sollevare il dito dopo aver premuto all'interno della sovrapposizione) si dovrebbero ricevere eventi multi-touch. Ho aggiunto '\ nPOINTERS:" + event.getPointerCount() 'a ciascuna delle chiamate' info.setText' nel mio esempio e il conteggio dei puntatori aumenta \ diminuisce quando ho toccato \ sollevato le dita Dopo il primo in basso, ho ricevuto solo gli eventi di spostamento, ma il conteggio dei puntatori è ancora cambiato. – jawsware
Ma quello che voglio è in realtà ottenere multi-touch con TYPE_SYSTEM_OVERLAY. È comunque possibile? – Ravs