2011-07-01 4 views
9

私は、サム/ハンドル部分でのみ変更できるようにしたいシークバーを持っています。ユーザーが他の場所でタップした場合、そのタップを無視してください。Android Seekbar - 親指でのみ変更できますか?

これを行うための継承プロパティはありますか?もしそうでなければ、私はすでにonTouchリスナーを設定し、それを "無効にする"ためにtrueを返すことができると知っていますが、親指がタップされたときに検出する方法があります。

+0

私もこの答えを知りたいのですが... – Josh

+0

あなたはここに私の答え http://stackoverflow.com/questions/5126091/disable-progress-change-when-を見ることができますユーザーのシングル・タップ・オン・ザ・シークバー・イン・アンドロイド/ 16992969#16992969 – Slim

答えて

3

コードで親指の位置を変更したいと思っていますが、これはユーザー制限されています。これは試してみてください。

  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

私は同じ問題を持っていた、私は新しいプログレスX OldProgressを比較するために、単純なロジックを使用して固定しました。 これは、ユーザーがThumbをクリックしたときに変更値を許可するVerticalSliderに対する私のコードです。

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

よろしく:

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

これは、すべてのコンポーネントのソースです:

これはトリックです!

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; 
} 
関連する問題