2012-05-09 18 views
20

Voglio implementare un'azione ripetuta premendo e tenendo premuto un pulsante. Esempio: quando l'utente fa clic su un pulsante e lo tiene premuto, dovrebbe chiamare ancora e ancora un metodo simile su un intervallo fisso finché l'utente non rimuove il dito dal pulsante.azione di ripetizione Android premendo e tenendo premuto un pulsante

+3

Ma è la necessità della mia applicazione. Voglio spostare il cursore costantemente mentre l'utente tiene premuto il pulsante. Funziona bene per ogni tocco. Voglio solo ripetere l'azione mentre l'utente tiene premuto il pulsante. –

+2

@JoxTraex: per favore specifica il tuo punto di vista in una risposta e vedi quanti voti positivi ottiene. –

risposta

59

Esistono diversi modi per eseguire questa operazione, ma uno piuttosto semplice sarebbe postare un Runnable su un Handler con un certo ritardo. Nella sua forma più elementare, si avrà un aspetto un po 'come questo:

Button button = (Button) findViewById(R.id.button); 
button.setOnTouchListener(new View.OnTouchListener() { 

    private Handler mHandler; 

    @Override public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if (mHandler != null) return true; 
      mHandler = new Handler(); 
      mHandler.postDelayed(mAction, 500); 
      break; 
     case MotionEvent.ACTION_UP: 
      if (mHandler == null) return true; 
      mHandler.removeCallbacks(mAction); 
      mHandler = null; 
      break; 
     } 
     return false; 
    } 

    Runnable mAction = new Runnable() { 
     @Override public void run() { 
      System.out.println("Performing action..."); 
      mHandler.postDelayed(this, 500); 
     } 
    }; 

}); 

L'idea è piuttosto semplice: inviare un Runnable contenente l'azione ripetuta su un Handler quando si verifica l'azione tocco 'down'. Dopodiché, non postare di nuovo il codice Runnable fino a quando non viene superata l'azione di tocco "su". Lo Runnable continuerà a postare se stesso su Handler (mentre l'azione tattile 'in basso' sta ancora accadendo), fino a quando non viene rimosso dall'azione di ritocco - questo è ciò che abilita l'aspetto 'ripetuto'.

A seconda del comportamento effettivo del pulsante e del suo onclick/onuch che si sta cercando, è possibile eseguire il post iniziale senza ritardo.

+0

se voglio fare qualcosa in più quando l'utente tiene premuto il pulsante per diciamo 5 secondi, come posso riconoscere che l'utente trattiene il pulsante per 5 secondi. –

+0

Si potrebbe semplicemente spingere un altro 'Runnable 'in ritardo al' Handler'. Se dovrebbe essere un evento one-off, semplicemente non pubblicarlo di nuovo dal 'Runnable' stesso. Inoltre, non dimenticare di rimuoverlo nell'azione 'su', nel caso in cui il pulsante venga rilasciato prima che siano passati quei 5 secondi. –

+0

Giù il voto mentre gli ascensori al di fuori dell'area del pulsante continueranno a sparare al conduttore. ACTION_CANCEL è richiesto come minimo su ACTION_UP. Sfortunatamente se il pulsante si trova in una scrollview o in un altro widget scorrevole questo codice può far sembrare che il widget toccato sia ancora trattenuto anche se potrebbe essere fuori dallo schermo o lontano dal dito dell'utente. –

0

È possibile registrare uno View.OnKeyListener per quella vista. Tieni presente che è meglio rimbalzare tali callback, altrimenti, nel caso in cui il tuo metodo esegua qualcosa di leggermente "pesante", l'interfaccia utente non sarà liscia.

1

Anche se non è una grande idea. Potrebbe essere eseguito avviando un timer su onKeyDown per sparare a un intervallo durante il quale si sposta il cursore di un passo e si riavvia il timer. È quindi possibile annullare il timer sull'evento onKeyUp. Il modo in cui questo funziona su altri sistemi è in genere quello di spostare il primo tasto verso il basso quindi attendere un po 'per garantire che l'utente stia trattenendo definitivamente il pulsante ... quindi la ripetizione può essere un po' più veloce. Pensa a una ripetizione automatica della tastiera. Questo dovrebbe funzionare e non dovrebbe influire negativamente sul thread dell'interfaccia utente.

+0

Perché dici che non è una grande idea? – Suragch

Problemi correlati