2012-03-20 4 views
10

È possibile spostare la barra di ricerca solo quando si sposta il pollice. In questo momento la barra di ricerca si sposta anche con il tocco delle dita nel progressdrawable . Come disabilitiamo il movimento della barra di ricerca sul tocco delle dita del progress2able?Soluzione Android seekbar

Grazie.

+0

dove in grado di raggiungere questo obiettivo? Sto avendo lo stesso problema urgente aiuto necessario –

+0

@ Jay: HI, ho lo stesso problema come te hai trovato qualche soluzione per questo? Si prega di condividere con noi se avete una soluzione per questo ... – Rishi

risposta

2

Override l'OnTouchListener per SeekBar e unico processo il movimento sul pollice quando lo MotionEvent è un evento di spostamento.

event.getAction() == MotionEvent.ACTION_MOVE

Aggiornamento: 1

Qualcosa del genere funziona, ma il problema è che, anche se l'utente sposta il pollice 2 unità SeekBar muove. E non dovresti davvero smettere questo comportamento in quanto farebbe pasticciare la barra di ricerca.

seekBar.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if(event.getAction() == MotionEvent.ACTION_MOVE){ 
        Log.d(TAG, "Moved , process data, Moved to :" + seekBar.getProgress()); 
        seekBar.setProgress(seekBar.getProgress()); 
        return false; 
       } 
       Log.d(TAG, "Touched , Progress :" + seekBar.getProgress()); 
       return true; 
      } 
     }); 
+0

Hie, è in qualche modo utile per me .. ma ancora quando clicco su seekbar, il progresso è in crescita senza muovere o toccare con il pollice .. puoi darmi tutti i dettagli per favore? –

+0

ha aggiornato la risposta :) –

+1

Ehi, ma a volte non funziona .. –

0

Hai guardato questo:

filo davvero simile che dovrebbe aiutare a risolvere la tua domanda:

SeekBar's thumb only appears when touched

Buona fortuna

+0

Ciao non voglio sparire pollice, voglio solo disabilitare l'evento di intrappolamento .. l'utente non può in grado di toccare sulla barra di ricerca n aumentare i progressi. il progresso può aumentare solo quando sposto il pollice. Grazie –

+0

In questo momento cosa sta succedendo? Quando clicco sulla regione della barra di ricerca su di essa senza toccare n spostarsi sul pollice, il pollice si muoverà automaticamente è sbagliato con me ... l'utente può solo progredire con il tocco n muoversi sul pollice. –

7

ho trovato che il problema è che Ravi's solution toccare e spostando fuori della posizione attuale pollice sarebbe ancora causare un salto.

La classe di seguito risolve il problema e sostituisce il salto al tocco con un piccolo incremento, lo stesso che si otterrebbe con i tasti freccia.


import android.content.Context; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.widget.SeekBar; 

/** 
* A NoSkipSeekBar is an extension of {@link SeekBar} that prevents jumps in position 
* by touching outside the current thumb position. Such touches are replaced by 
* an increment or decrement the same as would be achieved using a DPAD's Left or 
* Right arrow keys. 
*/ 
public class NoSkipSeekBar extends SeekBar { 

    public NoSkipSeekBar(Context context) { 
     super(context); 
    } 

    public NoSkipSeekBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public NoSkipSeekBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    private boolean isDragging; 

    private boolean isWithinThumb(MotionEvent event) { 
     return getThumb().getBounds().contains((int)event.getX(), (int)event.getY()); 
    } 

    private void increment(int direction) { 
     if (direction != 0) { 
      final KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, 
        direction < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT); 
      onKeyDown(key.getKeyCode(), key); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (!isEnabled() || getThumb() == null) return super.onTouchEvent(event); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if (isWithinThumb(event)) { 
       isDragging = true; 
       return super.onTouchEvent(event); 
      } else { 
       return true; 
      } 

     case MotionEvent.ACTION_UP: 
      isDragging = false; 
      if (isWithinThumb(event)) { 
       return super.onTouchEvent(event); 
      } else { 
       final Rect r = getThumb().getBounds(); 
       increment((int)event.getX() - (r.left + r.right)/2); 
       return true; 
      } 

     case MotionEvent.ACTION_MOVE: 
      if (!isDragging) return true; 
      break; 

     case MotionEvent.ACTION_CANCEL: 
      isDragging = false; 
      break; 
     } 

     return super.onTouchEvent(event); 
    } 
} 
+1

grazie mi ha aiutato, sembra una soluzione no una soluzione temporanea come la risposta accettata, +1 per quello – serine

+0

funziona perfettamente - buona risposta –

0

soluzione di Ravi è grande, ho fatto un po 'di refactoring di seguito:

due scopi:

  1. risolvere la funzione getThumb() che solo può utilizzare sopra l'API 16 numeri.
  2. cliccando SeekBar non invocherà le onStopTrackingTouch() ma trascinare solo il pollice

Questo è il mio codice:

public class NoSkipSeekBar extends SeekBar { 

    Drawable mThumb; 
    @Override 
    public void setThumb(Drawable thumb) { 
     super.setThumb(thumb); 
     mThumb = thumb; 
    } 
    public Drawable getSeekBarThumb() { 
     return mThumb; 
    } 

    public NoSkipSeekBar(Context context) { 
     super(context); 
    } 

    public NoSkipSeekBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public NoSkipSeekBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    private boolean isDragging; 
    private boolean isStart = false; 
    private boolean isWithinThumb(MotionEvent event) { 
     Rect rect = getSeekBarThumb().getBounds();//increate the thumb invoke area 
     Rect rect1 = new Rect(); 
     rect1.left = rect.left - 50; 
     rect1.right = rect.right + 50; 
     rect1.bottom = rect.bottom + 50; 
     return rect1.contains((int)event.getX(), (int)event.getY()); 
    } 

    private void increment(int direction) { 
     if (direction != 0) { 
      final KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, 
        direction < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT); 
      onKeyDown(key.getKeyCode(), key); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (!isEnabled() || getSeekBarThumb() == null) return super.onTouchEvent(event); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       if (isWithinThumb(event)) { 
        isDragging = true; 
        isStart = true; 
        return super.onTouchEvent(event); 
       } else { 
        return true; 
       } 

      case MotionEvent.ACTION_UP: 
       isDragging = false; 
       if(isStart){ 
        isStart = false; 
        return super.onTouchEvent(event); 
       } 
       if (isWithinThumb(event)) { 
        return super.onTouchEvent(event); 
       } else { 
        //final Rect r = getThumb().getBounds(); 
        //increment((int)event.getX() - (r.left + r.right)/2); 
        return true; 
       } 
      case MotionEvent.ACTION_MOVE: 
       if (!isDragging) return true; 
       break; 

      case MotionEvent.ACTION_CANCEL: 
       isDragging = false; 
       break; 
     } 

     return super.onTouchEvent(event); 
    } 
}