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.)
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
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
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