2011-07-01 8 views
9

Tengo una barra de búsqueda que solo quiero permitir cambiar con la parte del mango/pulgar. Si el usuario toca en otro lugar, me gustaría que se ignore ese toque.Android Seekbar: ¿solo permite cambiar con el pulgar?

¿Existe alguna propiedad inherente para hacer esto? Si no, ya sé que puedo configurar un oyente onTouch y devolver true para "deshabilitarlo", pero ¿hay alguna manera de detectar cuándo se toca el pulgar para que pueda decir a onTouch que devuelva false en ese caso?

+0

También me gustaría saber la respuesta a esta ... – Josh

+0

Usted puede ver mi respuesta aquí http://stackoverflow.com/questions/5126091/disable-progress-change-when- user-single-tap-on-the-seekbar-in-android/16992969 # 16992969 – Slim

Respuesta

3

Supongo que quiere cambiar la posición del pulgar a través del código, que está restringido por el usuario.Por eso, intente esto. Puede que lo ayude.

  myseekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

      int originalProgress; 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       originalProgress = seekBar.getProgress(); 
      } 

      @Override 
      public void onProgressChanged(SeekBar seekBar, int arg1, boolean fromUser) { 
       if(fromUser == true){ 
        seekBar.setProgress(originalProgress); 
       }    
      } 
     }); 
0

Tuve el mismo problema, lo arreglé usando una lógica simple para comparar el nuevo Progress X OldProgress. Este es mi código para un VerticalSlider que solo permite cambiar el valor cuando el usuario hace clic sobre el Thumb.

Este es el truco:

int tempProgress = (getMax() - (int) (getMax() * event.getY()/getHeight())); 
      int diff = Math.abs(tempProgress - progress); 
      if (diff > 7 && !isMoving) return true; 
      isMoving = true; 

Todo esto es fuente de componente:

package android.widget; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 

public class VerticalSeekBar extends SeekBar { 

    private OnSeekBarChangeListener onChangeListener; 
    private int progress = 0; 
    private Drawable mThumb; 
    private boolean isMoving; 

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

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

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

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(h, w, oldh, oldw); 
    } 

    @Override 
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(heightMeasureSpec, widthMeasureSpec); 
     setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); 
    } 

    protected void onDraw(Canvas c) { 
     c.rotate(-90); 
     c.translate(-getHeight(), 0); 

     super.onDraw(c); 
    } 

    @Override 
    public void setOnSeekBarChangeListener(OnSeekBarChangeListener onChangeListener){ 
     this.onChangeListener = onChangeListener; 
    } 

    public void setThumb(Drawable thumb) { 
     if (thumb != null) { 
      thumb.setCallback(this); 
     } 
     super.setThumb(thumb); 
     mThumb = thumb; 
     mThumb.setCallback(this); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (!isEnabled()) { 
      return false; 
     } 

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

      if (onChangeListener!= null)onChangeListener.onStartTrackingTouch(this); 
      setPressed(true); 
      setSelected(true); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      int tempProgress = (getMax() - (int) (getMax() * event.getY()/getHeight())); 
      int diff = Math.abs(tempProgress - progress); 
      if (diff > 7 && !isMoving) return true; 
      isMoving = true; 
      progress = getMax() - (int) (getMax() * event.getY()/getHeight()); 
      if(progress < 18) {progress = 18;} 
      if(progress > getMax()) {progress = getMax();} 
      setProgressAndThumb(progress); 
      setPressed(true); 
      setSelected(true); 
      break; 
     case MotionEvent.ACTION_UP: 
      isMoving = false; 
      if (onChangeListener!= null)onChangeListener.onStopTrackingTouch(this); 
      setPressed(false); 
      setSelected(false); 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      isMoving = false; 
      super.onTouchEvent(event); 
      setPressed(false); 
      setSelected(false); 
      break; 
     } 
     return true; 
    } 

    public synchronized void setProgressAndThumb(int progress) { 
     setProgress(progress); 
     onSizeChanged(getWidth(), getHeight() , 0, 0); 
     if (onChangeListener!= null) onChangeListener.onProgressChanged(this, progress, true); 
    } 

    @Override 
    public synchronized void setProgress(int progress) { 
     this.progress =progress; 
     super.setProgress(progress); 
     if (onChangeListener !=null) onChangeListener.onProgressChanged(this, progress, true); 
    } 

    public synchronized void setMaximum(int maximum) { 
     setMax(maximum); 
    } 

    public synchronized int getMaximum() { 
     return getMax(); 
    } 
} 

Saludos!

0
// I solved this problem. 

private int mOriginProgress; 
private boolean mIsDrag; 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 
    mIsTouched = true; 
    mOriginProgress = seekBar.getProgress(); 
} 

@Override 
public void onProgressChanged(SeekBar seekBar, int p, boolean fromUser) { 
    if (mOriginProgress == p) { 
     return; 
    } 

    if (mIsDrag) { 
     // do something 
    } else { 
     if (Math.abs(mOriginProgress - p) > 5) { 
      seekBar.setProgress(mOriginProgress); 
     } else { 
      mIsDrag = true; 
     } 
    } 
} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    mIsDrag = false; 
} 
Cuestiones relacionadas