Autore Topic: Pulsante tenuto premuto  (Letto 669 volte)

Offline gix

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Nexus S e Asus TF-101
  • Sistema operativo:
    Windows xp
Pulsante tenuto premuto
« il: 13 Marzo 2014, 16:01:58 CET »
0
Salve a tutti.
Ho un problema, so già che sicuramente è una stupidata ma non riesco a trovare la soluzione.
Ho un Button che quando è premuto deve eseguire una certe azione (nel mio caso inviare un messaggio) solo che voglio che questa azione venga eseguita per tutto il tempo in cui io tengo premuto col mio dito il pulsante e termini quando lo rilascio.
Con la classe OnClickListener e il suo metodo onClick esegue l'azione solo un volta indipendentemente da quanto tempo tengo premuto il pulsante.
Ho provato anche con setOnTouchListener(new OnTouchListener() { onTouch.... ma anche quello non mi ha soddisfatto. Invia un messaggio solo quando percepisce una azione ma se tengo premuto immobile su di esso non fa niente.

Come posso fare?
Grazie 1000.

Offline FrancescoAndroid

  • Utente junior
  • **
  • Post: 69
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    GiMiSiS Interactive
  • Sistema operativo:
    Android 2.3.3
Re:Pulsante tenuto premuto
« Risposta #1 il: 13 Marzo 2014, 16:24:08 CET »
0
considerando i vari event listener suppongo non si possa fare oppure è davvero complicato farlo.

Input Events | Android Developers

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Pulsante tenuto premuto
« Risposta #2 il: 13 Marzo 2014, 16:31:50 CET »
0
Non ho mai provato direttamente ma direi che se registri un touch listener:

View.OnTouchListener | Android Developers

ti viene passato ACTION_DOWN quando il bottone viene premuto e ACTION_UP quando viene rilasciato.

Al massimo prova a metterei dei log e vedi i valori che vengono passati. Non dovrebbe essere difficile.

Offline FrancescoAndroid

  • Utente junior
  • **
  • Post: 69
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    GiMiSiS Interactive
  • Sistema operativo:
    Android 2.3.3
Re:Pulsante tenuto premuto
« Risposta #3 il: 13 Marzo 2014, 17:19:36 CET »
0
si ma cosi ne manda 2 uno alla pressione e uno al rilascio mentre lui vuole fare il durante... non credo esista un evento che gestisca il durante

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Pulsante tenuto premuto
« Risposta #4 il: 13 Marzo 2014, 18:49:14 CET »
0
si ma cosi ne manda 2 uno alla pressione e uno al rilascio mentre lui vuole fare il durante... non credo esista un evento che gestisca il durante
Premettendo il fatto che non conosco gli eventi citati da Ricky e non ho mai affrontato un problema simile, secondo me potrebbe ottenere un riferimento in millisecondi all'ACTION_DOWN e all'ACTION_UP, fare una sottrazione tra i valori ottenuti e utilizzare il risultato nel metodo postDelayed() di un Handler. Magari esistono soluzioni migliori, non saprei.

Inviato dal mio Galaxy Nexus con Tapatalk 2

SimoneDev @ Google Play Store

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:Pulsante tenuto premuto
« Risposta #5 il: 13 Marzo 2014, 19:19:10 CET »
0
Ho un Button che quando è premuto deve eseguire una certe azione (nel mio caso inviare un messaggio) solo che voglio che questa azione venga eseguita per tutto il tempo in cui io tengo premuto col mio dito il pulsante e termini quando lo rilascio.

E' molto importante stabilire in che senso l'azione che vuoi compiere deve essere eseguita tutto il tempo. Cioè se devono essere inviati messaggi a ripetizione alla massima velocità oppure uno ogni tanto.

Faccio un esempio di un caso in cui potrebbe esserci un comportamento simile a quello che descrivi: voglio che un contatore si incrementi di uno al secondo fintanto che tengo premuto il button "freccia in alto". In questo caso io rileverei l'evento ACTION_DOWN, farei un postmessagedelayed con ritardo di un secondo, quando vado a gestire il messaggio incremento la TextView e se il button e sempre in stato premuto, faccio un altro postmessagedelayed.

Applicato ai messaggi ne manderebbe uno al secondo (ma bisogna vedere se l'azione di invio messaggi è breve o a sua volta prende secondi).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Aaaaabbbb

  • Utente junior
  • **
  • Post: 55
  • Respect: +3
    • Google+
    • pietmau
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7, Samsung GT-S5830i, LG Optimus, Galaxy Tab 3
  • Play Store ID:
    aaaaaaaaaaaa
  • Sistema operativo:
    Win, Ubuntu
Re:Pulsante tenuto premuto
« Risposta #6 il: 15 Marzo 2014, 10:52:47 CET »
+1
Ciao,
Prova questo e fammi sapere se ti va bene.
Ciao!

Codice (Java): [Seleziona]
boolean threadBool = true;


yourbutton.setOnTouchListener(new OnTouchListener() {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {

                                switch (event.getAction()) {

                                case MotionEvent.ACTION_DOWN:
                                        threadBool = true;
                                        thread = new Thread(yourRunnable);
                                        thread.start();
                                        Log.e("", "inizia task");
                                        break;
                                }      
                                case MotionEvent.ACTION_UP:
                                        threadBool = false;
                                        Log.e("", "cancella task");
                                        break;
                                }
                               return false;
                });

        Runnable yourRunnable = new Runnable() {
                @Override
                public void run() {
                        for (int i = 0; i <100; i++) {// O UN LOOP PIU'ADATTO ALLE TUE ESIGENZE
                                if (threadBool == false) {
                                        threadBool = true;
                                        break;
                                }
                                //FAI QUELLO CHE DEVI FARE...

                        }
                }
        };