2016-08-22 197 views
0

我知道我不是第一个在Android上使用VerticalSlider的问题,但即使我记得努力让它在第一个地方工作,这是第一次我有一个部分工作的setProgress()。垂直SeekBar Android,如何使用SetProgress()更新滑块位置()

所以这里是事情。 表示滑块的蓝线已正确更新,但应该移动的微小“按钮”根本不会移动。 (见图片)

蓝线正在根据我发送的值移动,但“按钮”不是。它正在移动一点,但完全没有遵循蓝线---这是正确的。 (如果你有一个“按钮”和蓝线更好的条件,随意编辑Progress线也许?)

因此,这是我对垂直滑块代码:

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.widget.SeekBar; 

public class VerticalSeekBar extends SeekBar { 
    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 canvas) { 
     canvas.rotate(-90); 
     canvas.translate(-getHeight(), 0); 
     super.onDraw(canvas); 
    } 

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

     boolean result = false; 

     if (event.getAction() != MotionEvent.ACTION_MOVE) { 
      // Prevent duplicate haptic feedback events (due to 
      // setProgress() below) 
      boolean hf = isHapticFeedbackEnabled(); 
      setHapticFeedbackEnabled(false); { 
       // This is required for OnSeekBarChangeListener.on{Start,Stop}TrackingTouch() 
       result = super.onTouchEvent(event); 
      } setHapticFeedbackEnabled(hf); 
     } 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_MOVE: 
       // Vertical scrolling 
       setProgress(getMax() - (int)(getMax() * event.getY()/getHeight())); 
       onSizeChanged(getWidth(), getHeight(), 0, 0); 
       result = true; 
       break; 
     } 

     return result; 
    } 

    public void customSetProgress(int progress) { 
     setProgress(progress); 
     onSizeChanged(getWidth(), getHeight(), 0, 0); 
    } 
} 

这我如何更新滑块:

float value = //... Get the value here from other computations 
    // We need to use int for the slider 
    final int step = 1; 
    final int max = (int)MAXPRECISION * 100; 
    final int min = (int)MINPRECISION * 100; 
    final double initialPosition = (double)max ; 
    final int valueInt = (int) (value * 100) ; 

    final VerticalSeekBar sliderPrecision = (VerticalSeekBar)findViewById(R.id.verticalSliderPrecision); 

    sliderPrecision.setProgress(valueInt); 
    sliderPrecision.setMax((max - min)/step); //To make sure it is updated as seen in some SO post. 

我非常有信心,我的VerticalSlider类是好的,我已经能够正确年前使用它。所以其他代码肯定有问题,但我找不到可能的结果。

如这里的图片,他们是:

Slider 01Slider 02

回答

0

于是我发现,这是通过调用onSizeChanged(getWidth(), getHeight(), 0, 0);

所以我已经创建了一个更新VerticalSeekBar,现在工作得很好解决。我真希望它能帮助别人和他们一起挣扎。

这是更新的类:

import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.SeekBar;

public class VerticalSeekBar extends SeekBar { 
    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 canvas) { 
     canvas.rotate(-90); 
     canvas.translate(-getHeight(), 0); 
     super.onDraw(canvas); 
    } 

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

     boolean result = false; 

     if (event.getAction() != MotionEvent.ACTION_MOVE) { 
      // Prevent duplicate haptic feedback events (due to 
      // setProgress() below) 
      boolean hf = isHapticFeedbackEnabled(); 
      setHapticFeedbackEnabled(false); { 
       // This is required for OnSeekBarChangeListener.on{Start,Stop}TrackingTouch() 
       result = super.onTouchEvent(event); 
      } setHapticFeedbackEnabled(hf); 
     } 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_MOVE: 
       // Vertical scrolling 
       setProgress(getMax() - (int)(getMax() * event.getY()/getHeight())); 
       onSizeChanged(getWidth(), getHeight(), 0, 0); 
       result = true; 
       break; 
     } 

     return result; 
    } 

    public void customSetProgress(int progress) { 
     setProgress(progress); 
     onSizeChanged(getWidth(), getHeight(), 0, 0); 
    } 
}