2016-08-22 42 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); 
    } 
}