Autore Topic: condizione "WHILE" su TouchEvent  (Letto 1022 volte)

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
condizione "WHILE" su TouchEvent
« il: 27 Settembre 2011, 00:29:35 CEST »
0
Salve a tutti, spero come sempre di aver postato nella sezione giusta..
Sto sbattendo la testa su un problema che reputavo banalissimo..

Ho fatto l'override del touchEvent e ho i tre case principali. All'evento "ACTION_DOWN" voglio far aumentare un integer fin quando lo schermo viene toccato. Ho inserito una condizione "While" che manda in crash(o meglio impalla senza possibilità di ripristino(e di recuperare il Logcat) il mio programmino. Ho una situazione di questo tipo(dove ovviamente la variabile da incrementare aumenta di 1 ad ogni tocco):

Codice (Java): [Seleziona]
@Override
        public boolean onTouchEvent(MotionEvent event) {

                synchronized (_thread.getSurfaceHolder()) {
                        getCoords(event);

                        switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                                                               
                                        variabile_da_incrementare++;
                                       
                                break;

                        case MotionEvent.ACTION_MOVE:

                                break;

                        case MotionEvent.ACTION_UP:
                       
                                break;
                        }              
                }
                return true;
        }

ho scritto qualcosa del tipo :

Codice (Java): [Seleziona]
while (event.getAction() == MotionEvent.ACTION_DOWN){
variabile_da_incrementare++;
if(variabile_da_incrementare == 100) {variabile_da_incrementare = 100;}
}  

ma senza alcun successo.. che ciclo dovrei creare?
Sergio

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:condizione "WHILE" su TouchEvent
« Risposta #1 il: 27 Settembre 2011, 01:43:30 CEST »
0
Scusa forse ho capito male io, tu vuoi che se un utente tiene premuto un pulsante ad esempio vuoi far incrementare un contatore ?
Oppure al touch ogni volta incrementi un contatore di 1 ?
Hai provato ad intercettare anche i seguenti eventi per interrompere l'azione:
Codice: [Seleziona]
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:

È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:condizione "WHILE" su TouchEvent
« Risposta #2 il: 27 Settembre 2011, 11:26:39 CEST »
0
Scusa forse ho capito male io, tu vuoi che se un utente tiene premuto un pulsante ad esempio vuoi far incrementare un contatore ?

esattamente, fin quando si tiene premuto, il contatore aumenta.. purtroppo sembra di non poter uscire dalla condizione while..
la variabile aumenta a dismisura fino a quando il programma non crasha.

Perchè(e come) dovrei interrompere l'azione con ACTION_UP?
il while non dovrebbe agire fin quando ACTION_DOWN è attivo?
e inoltre, perchè non viene rispettata la condizione:
Codice (Java): [Seleziona]
if(variabile_da_incrementare == 100) {variabile_da_incrementare = 100;

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:condizione "WHILE" su TouchEvent
« Risposta #3 il: 27 Settembre 2011, 11:32:00 CEST »
0
e inoltre, perchè non viene rispettata la condizione:
Codice (Java): [Seleziona]
if(variabile_da_incrementare == 100) {variabile_da_incrementare = 100;
io scriverei così:
Codice (Java): [Seleziona]
if(variabile_da_incrementare >= 100) {variabile_da_incrementare = 100;
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:condizione "WHILE" su TouchEvent
« Risposta #4 il: 27 Settembre 2011, 11:49:53 CEST »
0
Grazie Luigi! La condizione viene effettivamente rispettata.. resta il fatto che non si riesce ad uscire dal while, nonostante io non prema più lo schermo.

Come risultato ho un 100 ripetuto di continuo, e il crash del programma.
Non capisco se lo sbaglio è la scorretta posizione del loop While( inserita dentro il case "ACTION_DOWN")

Codice (Java): [Seleziona]
@Override
        public boolean onTouchEvent(MotionEvent event) {

               
                        switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:

                                while(event.getAction()== MotionEvent.ACTION_DOWN)
                                {variabile =variabile + 1;

                                if(variabile >= 100){variabile = 100;                          

                                }
                                Log.i("info","valore :"+ variabile);
                                }

                                break;

                        case MotionEvent.ACTION_MOVE:

                                break;


                        case MotionEvent.ACTION_UP:                            

                               
                                break;
                        }              
                }
                return true;
        }

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:condizione "WHILE" su TouchEvent
« Risposta #5 il: 27 Settembre 2011, 12:08:12 CEST »
0
Prova ad intercettare l'evento MotionEvent.ACTION_CANCEL, cerca di capire se quando lasci il pulsante entra in questo evento
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:condizione "WHILE" su TouchEvent
« Risposta #6 il: 27 Settembre 2011, 12:33:21 CEST »
0
Grazie per la pazienza Luigi.. No, non riesco ad intercettare l'ACTION_CANCEL
Sono riuscito ad uscire dal loop tramite un banalissimo break, ad ogni modo credo che l'approccio del while non sia corretto.

Accade la seguente cosa, impostando un valore massimo di 10.000

-Premo lo schermo
-La variabile aumenta (leggo tramite Log.i) da 1 fino a 10.000 in qualche secondo, ANCHE se smetto di toccare lo schermo.Una volta partito il loop,dunque,  non ho modo di fermarlo.
-Arrivato a 10.000 esce dal loop While.

Farò altre prove e terrò aggiornato questo topic:)
Sergio

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:condizione "WHILE" su TouchEvent
« Risposta #7 il: 27 Settembre 2011, 14:01:37 CEST »
+1
Concettualmente il codice è errato.

Non ha senso intercettare un evento e aspettare che l'evento cambi dentro la gestione dell'evento stesso.

Consiglio di leggere molto bene la documentazione sulla gestione degli eventi della UI:

Handling UI Events | Android Developers
adb logcat | tee /tmp/logcat | grep TAG

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:condizione "WHILE" su TouchEvent
« Risposta #8 il: 27 Settembre 2011, 18:38:24 CEST »
0
E' sbagliato anche perchè così il tuo codice è bloccante. Il tuo ciclo while è dentro un costrutto switch, il quale nel caso l'evento "catturato" sia di tipo ACTION_DOWN esegue il tuo ciclo...dal quale non può uscire poichè l'evento non si è consumato ! Di conseguenza non potrai più intercettare alcun evento oltre a quello e quindi la condizione del while rimane vera...

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:condizione "WHILE" su TouchEvent
« Risposta #9 il: 27 Settembre 2011, 18:46:09 CEST »
0
E' sbagliato anche perchè così il tuo codice è bloccante. Il tuo ciclo while è dentro un costrutto switch, il quale nel caso l'evento "catturato" sia di tipo ACTION_DOWN esegue il tuo ciclo...dal quale non può uscire poichè l'evento non si è consumato ! Di conseguenza non potrai più intercettare alcun evento oltre a quello e quindi la condizione del while rimane vera...
Teskio cosa intendi per "Non si è consumato" ?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:condizione "WHILE" su TouchEvent
« Risposta #10 il: 27 Settembre 2011, 19:13:25 CEST »
0
Se ho capito bene il post di teschio (spero di non sbagliarmi!), il problema sta in queste righe:

Codice (Java): [Seleziona]
switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:

                                while(event.getAction()== MotionEvent.ACTION_DOWN)

Se sei nel caso MotionEvent.ACTION_DOWN, allora la condizione del while sarà vera, sempre (altrimenti non ci si sarebbe dentro!). Dunque si rimane in loop...l'evento non si "consuma" perchè non si dovrebbe riuscire ad uscire dal while.
Ho afferrato bene? ma se è così dovrebbe impallarsi tutto al primo tocco? Figo  :D

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:condizione "WHILE" su TouchEvent
« Risposta #11 il: 27 Settembre 2011, 19:15:29 CEST »
0
Allora...alcuni eventi hanno un valore di ritorno nel proprio metodo da sovrascrivere. Mi spiego. La maggior parte dei listener ritornano un valore booleano per "descrivere" se l'evento si è "consumato", cioè l'evento è stato catturato, elaborato e poi terminato...oppure no. Nel caso specifico il metodo onTouch() ha 3 eventi in sequenza da "elaborare", l'action down, l'action move e l'action up. Se nell'action down ad esempio si ritorna un valore false la sequenza si interromperà e non verrano catturati ne l'action move e ne l'action up, al contrario con un valore true verrano prese in considerazione anche le altre azioni...e così via.

Citazione da: Android Developers
onTouch() - This returns a boolean to indicate whether your listener consumes this event. The important thing is that this event can have multiple actions that follow each other. So, if you return false when the down action event is received, you indicate that you have not consumed the event and are also not interested in subsequent actions from this event. Thus, you will not be called for any other actions within the event, such as a finger gesture, or the eventual up action event.

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:condizione "WHILE" su TouchEvent
« Risposta #12 il: 27 Settembre 2011, 19:16:58 CEST »
0
Grazie Teschio  :-)
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline pegaso993

  • Utente junior
  • **
  • Post: 84
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    note 2
  • Sistema operativo:
    android
Re:condizione "WHILE" su TouchEvent
« Risposta #13 il: 03 Ottobre 2013, 14:22:54 CEST »
0
ragazzi vorrei fare un ciclo
un contatore che conta solo fino a 100 e poi segue un mia istruzione come posso fare

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:condizione "WHILE" su TouchEvent
« Risposta #14 il: 03 Ottobre 2013, 14:32:13 CEST »
0
ti conviene aprire una discussione nuova per un informazione nuova, comunque per fare un ciclo che conti fino a 100 ti conviene usare un for tipo:
Codice (Java): [Seleziona]
for(int i=0;i<100;i++){
    //codice che vuoi eseguire ad ogni passaggio
    }