2011-11-10 12 views
9

Sto tentando di ottenere più eventi di tocco su una vista di sovrapposizione di sistema, ma sto ricevendo solo l'evento MotionEvent.ACTION_OUTSIDE.Android: Multi touch e TYPE_SYSTEM_OVERLAY

Esiste un modo per ottenere più eventi di tocco su un overlay di sistema?

Qualsiasi esempio o collegamento sarebbe molto utile.

risposta

24

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:

  1. Guarda per l'evento ACTION_OUTSIDE movimento.
  2. Quando si verifica, verificare se si è verificato all'interno della sovrapposizione.
  3. Se così fosse, cambiare il tipo di LayoutParams-TYPE_SYSTEM_ALERT
  4. Una volta che l'interazione con la sovrapposizione è completa, tornare a TYPE_SYSTEM_OVERLAY
  5. 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.

+1

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

+0

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

+1

Ma quello che voglio è in realtà ottenere multi-touch con TYPE_SYSTEM_OVERLAY. È comunque possibile? – Ravs

9

A partire da Android 4.x, team di Android team di Android fissato un potenziale problema di sicurezza con l'aggiunta di una nuova funzione adjustWindowParamsLw() in cui aggiungerà FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE e rimuovere le bandiere FLAG_WATCH_OUTSIDE_TOUCH per la finestra TYPE_SYSTEM_OVERLAY.

Questa finestra TYPE_SYSTEM_OVERLAY non riceverà alcun evento di tocco sulla piattaforma ICS.

Aggiornamento: 2016/5/4 TYPE_TOAST non può ricevere eventi di tocco su Android 4.0 ~ 4.3. È lo stesso di TYPE_SYSTEM_OVERLAY. Su Android 4.4+, TYPE_TOAST è stato rimosso dall'elenco escluso, quindi puoi utilizzare TYPE_TOAST per ricevere eventi di tocco su dispositivi Android 4.4+.

+1

Questo è utile! Quindi, cosa stai suggerendo di utilizzare al posto di FLAG_WATCH_OUTSIDE_TOUCH per ottenere la stessa funzionalità prima di Android 4.0. C'è un'altra bandiera che dovrebbe essere implementata invece? – Brian

Problemi correlati