2011-07-01 49 views
9

Tôi có một thanh tìm kiếm mà tôi muốn chỉ cho phép thay đổi bằng phần ngón tay cái/tay cầm. Nếu người dùng chạm vào bất cứ nơi nào khác, tôi muốn nhấn vào đó.Android Seekbar - chỉ cho phép thay đổi bằng ngón tay cái?

Có tài sản kế thừa nào để thực hiện việc này không? Nếu không, tôi đã biết tôi có thể thiết lập một người nghe onTouch và trả lại true để "vô hiệu hóa" nó, nhưng có cách nào để phát hiện khi ngón tay cái được khai thác để tôi có thể nói onTouch trả lại false trong trường hợp đó?

+0

Tôi cũng muốn biết câu trả lời cho điều này ... – Josh

+0

Bạn có thể xem câu trả lời của tôi ở đây http://stackoverflow.com/questions/5126091/disable-progress-change-when- người dùng-duy nhất-tap-on-the-seekbar-in-android/16992969 # 16992969 – Slim

Trả lời

3

Tôi giả sử bạn muốn thay đổi vị trí ngón tay cái thông qua mã, đó là người dùng bị hạn chế. Vì vậy, hãy thử cách này. Có thể giúp bạn.

  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

Tôi đã gặp vấn đề tương tự, tôi đã cố định bằng cách sử dụng một logic đơn giản để so sánh tiến trình X cũ Progress X mới. Đây là mã của tôi đối với VerticalSlider, chỉ cho phép thay đổi giá trị khi người dùng nhấp vào Hình thu nhỏ.

Đây là lừa:

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

Đây là tất cả các nguồn thành phần:

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(); 
    } 
} 

Trân trọng!

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; 
} 
Các vấn đề liên quan