Autore Topic: Gestire evento bottone sempre premuto  (Letto 852 volte)

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Gestire evento bottone sempre premuto
« il: 14 Novembre 2012, 10:06:50 CET »
0
Salve a tutti, in un data entry ho dei bottoni + e - che gestiscono il cambiamento di valore di un contatore. Vorrei ottenere l'effetto di aumentare la velocita' di cambiamento di questo valore se tengo premuto il bottone. Ho provato l'evento onLongClickListener ma scatena l'evento una volta sola, mentre io vorrei che fosse vero per tutti il tempo che il bottone e' premuto. Avete qualche consiglio?
Risparmia l'acqua, bevi birra...

Offline Nicola_D

  • Moderatore
  • 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:Gestire evento bottone sempre premuto
« Risposta #1 il: 14 Novembre 2012, 10:19:14 CET »
0
on touch listener, evento di on touch down -> sposta e aumenta velocità finche non arriva l'evento di onTouchUp...
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 Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:Gestire evento bottone sempre premuto
« Risposta #2 il: 14 Novembre 2012, 11:02:57 CET »
0
Grazie mille. Ho capito l'idea, ma come faccio ad ottenere questa effetto?
Mi spiego, come posso ottenere quello che mi sembra un ciclo sull'evento? Se scrivo una cosa del genere si blocca sul while perche' per lui e' un evento solo... Diciamo che non registra gli altri eventi successivi.
Codice (Java): [Seleziona]
private View.OnTouchListener onLongPress = new OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {

                        while(event.getAction() != MotionEvent.ACTION_UP){
                                if(event.getAction() == MotionEvent.ACTION_DOWN){
                                        //aggiungi velocemente
                                }
                        }


                        return true;

                }

Altro problema e' che ho associato un onClickListener che effettua la somma di un elemento per volta e in questo modo viene ignorato perche' viene associato l'onTouchListener...
Risparmia l'acqua, bevi birra...

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:Gestire evento bottone sempre premuto
« Risposta #3 il: 14 Novembre 2012, 12:13:59 CET »
0
Indagando meglio ho visto che il metodo onTouch gestisce 3 eventi, ACTION_DOWN, ACTION_UP e ACTION_MOVE. Se io faccio una cosa del genere:
Codice (Java): [Seleziona]
private View.OnTouchListener myListener = new OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {

                        switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                                //trattamento evento bottone in pressione
                                break;
                        case MotionEvent.ACTION_UP:
                       
                                //trattamento evento fine pressione del bottone
                                break;

                        default:
                                break;
                        }

                        return true;

                }


        };

Il problema e' che quello che vorrei ottenere io (un finche l'evento ACTION_DOWN e' "attivo") non lo posso fare con quello che ho in mente, cioe' un while sull' getAction insomma, perche' se lo metto nel ramo del case diventa un ciclo infinito in quanto, fino a che non si consuma il listener, non sente il cambiamento dell'action e rimane sull l'effetto ACTION_DOWN...
Codice (Java): [Seleziona]
...
switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
//ciclo infinito!!!
                                 while(event.getAction()== MotionEvent.ACTION_DOWN){...}
                                break;
...

Come potrei ovviare questa cosa?
Risparmia l'acqua, bevi birra...

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:Gestire evento bottone sempre premuto
« Risposta #4 il: 14 Novembre 2012, 12:43:14 CET »
0
e se il while in questione lo gestisci con un thread separato?

nel thread imposti un bel if bottoneGiu e nel touchlistener metti:

Codice (Java): [Seleziona]
switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                                bottoneGiu = true;
                                break;
                        case MotionEvent.ACTION_UP:
                                bottoneGiu = false;
                                //trattamento evento fine pressione del bottone
                                break;


EDIT: magari il thread lo lanci sempre in bottone giù mettendo anche il flag a true (bottoneGiu) .... poi impostando il bottoneGiu = false uscirà dal ciclo e quindi si chiuderà il thread.

Codice (Java): [Seleziona]
while (bottoneGiu) {
.
.
.
}


Dipende se hai bisogno del thread sempre attivo o se hai bisogno del thread solo quando viene premuto il bottone
« Ultima modifica: 14 Novembre 2012, 12:49:11 CET da agenio »

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:Gestire evento bottone sempre premuto
« Risposta #5 il: 14 Novembre 2012, 12:46:00 CET »
0
Avevo immaginato una soluzione che usasse un thread separato, ma mi aspettavo che ci fosse una soluzione piu' semplice e veloce. Possibile che non venga offerto uno strumento che gestisca una situazione cosi' comune?
Risparmia l'acqua, bevi birra...

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:Gestire evento bottone sempre premuto
« Risposta #6 il: 14 Novembre 2012, 12:50:06 CET »
0
potresti usare un bel handler ... che è più facile da mettere in piedi piuttosto del thread

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:Gestire evento bottone sempre premuto
« Risposta #7 il: 14 Novembre 2012, 12:51:44 CET »
0
Non ho mai usato un handler, quindi non saprei come fare adesso...
Risparmia l'acqua, bevi birra...

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:Gestire evento bottone sempre premuto
« Risposta #8 il: 14 Novembre 2012, 12:57:35 CET »
0
in tanto ti linko la documentazione ufficiale sul handler

http://developer.android.com/reference/android/os/Handler.html

purtroppo ora devo scappare e in pochi secondi non son riuscito a trovare un bel tutorial su google

Offline Agosteeno

  • Utente normale
  • ***
  • Post: 152
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson - Xperia Neo
  • Sistema operativo:
    Ubuntu 11.04
Re:Gestire evento bottone sempre premuto
« Risposta #9 il: 14 Novembre 2012, 13:01:43 CET »
0
Figurati, grazie mille. Cerco un po' e vedo se vale la adottarlo, oppure lasciare il click singolo semplicemente. Ciao, buona giornata
Risparmia l'acqua, bevi birra...