2015-07-21 11 views
5

Ho un'app che viene utilizzata all'esterno, in tutte le condizioni. Questi sono sui tablet Nook B & con Android 2.1. Hanno il rilevamento del tocco ottico, non la pressione, quindi una grande goccia di pioggia sullo schermo può "disabilitare" il dispositivo, perché viene rilevato come una stampante, e quindi tutte le altre macchine non vengono rilevate.Come rilevare un tocco dello schermo che esiste già quando viene creata un'attività?

Parte 1: nell'attività in uso, rilevo manualmente schermate a schermo lunghe (10 secondi), coerenti con una goccia di pioggia che inizia una pressione di blocco. Io uso dispatchTouchEvent() per questo ed è tutto a posto.

Seconda parte: quindi apro una nuova attività e cerco effettivamente di abbassare la pioggia e di dire all'utente "cancella questa goccia di pioggia". La nuova attività si apre bene e posso disegnare cerchi con successo ovunque mi piaccia.

Il problema è che la nuova attività non riceve alcun evento di tocco per quella primissima stampa ... la stampa lunga che non si è ancora interrotta. Non ottenere un "nuovo" ACTION_DOWN è comprensibile ... L'ho già afferrato. Se alzo il dito, non c'è nemmeno ACTION_UP. Dopo il sollevando la stampa iniziale, tutti funzionano bene: posso toccare lo schermo, immediatamente un cerchio viene disegnato attorno al punto e si muoverà se trascino il dito, quindi non ci sono problemi lì.

Come ottengo la stampa iniziale, quella che mi ha portato qui, che esiste ancora? Dev'essere una specie di API di polling, non un evento, dal momento che voglio davvero lo stato attuale e so che l'evento è già stato risucchiato. Per essere chiari, NESSUN evento sta uscendo da dispatchTouchEvent() fino a quando non toglierò il mio dito dallo schermo (anche l'off non crea un evento rilevabile).

(I potrebbe prendere le coordinate dall'attività precedente e passarlo ... ma il problema è che la goccia di pioggia potrebbe scorrere durante il periodo di attesa di 10 secondi. E preferirei che l'attività fosse autonoma facendo il suo lavoro.)

risposta

2

Non sono sicuro che sia possibile (anche se non ho mai provato). Sono abbastanza sicuro che gli eventi tattili vengano cancellati non appena viene aperta la nuova attività.

L'approccio che è possibile decidere è utilizzare l'API Framgents o semplicemente aprire una nuova vista in cima alla vista che viene toccata.

The View che sta ricevendo gli eventi touch continuerà a farlo fino a quando uno di questi eventi accadono:

  1. Il metodo onTouchEvent() ritorna false. Se restituisce false in qualsiasi momento, smetterà di ricevere gli eventi di tocco tutti insieme. Significa che se si restituisce false in un'azione ACTION_MOVE, sarà non ricevere un'azione ACTION_UP.

  2. Si riceve un ACTION_CANCEL che indica che il gesto è terminato. Di solito significa che il tocco ha lasciato i limiti della vista, ma potrebbe essere una serie di motivi.

  3. Si riceve un ACTION_UP che significa l'ultimo dito toccato sollevato dalla vista.

Visualizzazioni nella parte posteriore riceveranno sempre eventi touch finché Visualizzazioni del cambio anteriore false per le azioni che più che fare per impostazione predefinita.Quindi se apri una nuova vista in cima alla vista che registra i tocchi, continua a registrare e passa le coordinate di disegno alla vista superiore.

+0

Man mano che avanza un po 'più avanti, mi rendo conto che l'ACTION_UP mancante è problematico. Questa è la mia notifica che la goccia è stata cancellata. E non è successo nella vista precedente. Mi chiedo se c'è un problema di stato in cui il sistema operativo non invia un ACTION_UP senza prima inviare un ACTION_DOWN. O forse prima di aprire questa attività ho bisogno di cancellare una coda di input/evento di qualche tipo. Potrei in qualche modo inviare un ACTION_CANCEL nella prima attività? – Anders8

+0

Un gesto completo viene avviato con un ACTION_DOWN e termina con un ACTION_UP o ACTION_CANCEL (tutte le altre azioni sono facoltative). Non riceverai eventi tattili a meno che tu non abbia un ACTION_DOWN e restituisca "true" che indica che la tua View vuole gestirlo. – DeeV

+0

Quando si passa ad un'altra attività, la vista di root viene modificata, quindi la vecchia 'View' che si stava toccando è scomparsa. Potresti * ottenere un ACTION_CANCEL se ciò accade, ma penso che sia più probabile che il sistema interrompa la catena di eventi touch e interrompa l'invio di azioni. Quando ciò accade, non riceverai più eventi di tocco nella nuova attività perché devi ricominciare la catena con un ACTION_DOWN (che è il motivo per cui ricomincia a funzionare quando alzi il dito e lo rimetti giù). – DeeV

Problemi correlati