Autore Topic: Thread o Handler per registrare punti touch?  (Letto 1279 volte)

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Thread o Handler per registrare punti touch?
« il: 25 Luglio 2012, 21:00:47 CEST »
0
Buonasera,

vi illustro brevemente il mio problema, attualmente ho una activity dalla quale voglio registrare i punti che tocca l'utente e in un secondo momento rieleborarli per fare una animazione.

Metodo 1: Funzionante
Nel ontouch del frameLayout faccio add delle coordinate x-y che leggo dal touch in un ArrayList e successivamente rielaboro i punti
Questo metodo funziona però non do nessun feedback a chi lo usa, quindi volevo disegnare delle linee man mano che l'utente muove il dito e son passato al Metodo 2

Metodo 2.a
Nel ontouch oltre a leggere i punti disegno le linee, il risultato è pessimo perchè l'evento onTouch scatta molto meno durante il movimento e perdo 2/3 dei punti

Metodo 2.b
Nel ontouch chiamo un handler che si occupa di disegnare e memorizzare i punti.
Il risultato è migliore del metodo 2.a però comunque perdo troppi punti per strada, credevo che chiamando l'handler l'evento on touch continuasse a scattare e gli eventi si accodassero sull'handler ma mi sbagliavo.

Secondo voi come potrei risolvere?
Pensavo a un thread o un AsyncTask, ma credo il risultato sia lo stesso, avete qualche suggerimento?
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Thread o Handler per registrare punti touch?
« Risposta #1 il: 25 Luglio 2012, 22:55:17 CEST »
+1
Hai considerato il fatto che l'evento ontouch, se gestito in modo completo, ti passa non solo l'ultimo punto, ma tutta la sequenza di punti (history) intercorsa dall'evento ontouch precedente?

Se non lo avevi considerato, è ben spiegato qua:
MotionEvent | Android Developers
« Ultima modifica: 25 Luglio 2012, 23:00:48 CEST da bradipao »
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Re:Thread o Handler per registrare punti touch?
« Risposta #2 il: 25 Luglio 2012, 23:11:15 CEST »
0
Hai considerato il fatto che l'evento ontouch, se gestito in modo completo, ti passa non solo l'ultimo punto, ma tutta la sequenza di punti (history) intercorsa dall'evento ontouch precedente?

Se non lo avevi considerato, è ben spiegato qua:
MotionEvent | Android Developers

Grande,
è vero, non avevo considerato questa ipotesi, a dire il vero non sapevo proprio della possibilità di vedere la history.
Grazie infinite, ho guardato le API e è proprio quello che fa al caso mio, e evito casini con thread e simili, domani provo, la soluzione era più banale del previsto!

Grazie ancora, metto come risolto il topic! :)
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Thread o Handler per registrare punti touch?
« Risposta #3 il: 25 Luglio 2012, 23:45:02 CEST »
+1
io poi ti consiglierei (non ne sono sicuro di aver capito il problema) ma di leggere riguardo le tecniche di buffering.

Te lo dico solo perchè ai tempi della tesi stavo lavorando con una lavagna elettronica e dovevo fare una cosa simile, ho dovuto usare il buffering perchè altrimenti dopo 20-30 punti si piantava tutto....
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Re:Thread o Handler per registrare punti touch?
« Risposta #4 il: 26 Luglio 2012, 22:17:17 CEST »
+3
Grazie per l'idea del Buffering Nicola, era l'idea che avevo all'inizio però poi ho risolto usando l'history come suggerito da Bradipao.

Se a qualcuno può servire posto il codice

Codice (Java): [Seleziona]
           public boolean onTouch(View v, MotionEvent motion) {

                                        switch (motion.getAction()) {
                                                case MotionEvent.ACTION_DOWN:
                                                case MotionEvent.ACTION_MOVE:

                                                        int historySize = motion.getHistorySize();
                                                        for ( int i = 0 ; i < historySize ; i++ ) {
                                                                float historicalX = motion.getHistoricalX(i);
                                                                float historicalY = motion.getHistoricalY(i);
                                                                elaboraPunto(historicalX, historicalY);
                                                        }

                                                        // After replaying history, connect the line to the touch point.
                                                        elaboraPunto(motion.getX(), motion.getY());
                                                        break;
                                         }
                               }


elaboraPunto è il metodo che rielabora i miei punti e fa tutte le operazioni che mi servivano.

P.s.: ATTENZIONE perchè se il movimento non è veloce getHistorySize() ritorna sempre 0, è quindi fondamentale che ci sia alla fine "elaboraPunto(motion.getX(), motion.getY());"
Da come ho capito l'history si riempie solo se il movimento è veloce, quindi è bene ricordarsi alla fine di rielaborare comunque i punti.

Spero possa tornare utile a qualcuno. ;)
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Thread o Handler per registrare punti touch?
« Risposta #5 il: 27 Luglio 2012, 08:22:23 CEST »
0
Spero possa tornare utile a qualcuno. ;)

Grazie per aver condivisio lo snippet della soluzione. E ti metto anche un +1, perchè purtroppo in pochissimi hanno la cortesia di tornare sul forum a spiegare come hanno risolto, come hai appena fatto.  :-)
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store