2016-08-22 13 views
0

私は、アンドロイドのVerticalSliderに問題があるのは初めてではないことを知っていますが、最初に動作させるのに苦労しています私が部分的に動作するsetProgress()を初めて持っています。Vertical SeekBar Android、SetProgress()でスライダの位置を更新する方法

だからここには事がある。 スライダを表す青い線は正しく更新されますが、移動するはずの小さな「ボタン」も全く動きません。 (画像参照)

青い線は私が送る値に応じて動きますが、「ボタン」はありません。それはちょっと動いていますが、青い線の後には全くありません---そうです。 (。?あなたは、「ボタン」と青のラインのためのより良い条件を持っている場合は、編集すること自由に感じプログレスラインは、多分)

だから、これは縦スライダーのための私が持っているコードです:

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. 

私は数年前にそれを適切に使用することができたとして、私の垂直スライダークラスが良好であることをかなり確信しています。コードの残りの部分には間違いがありますが、それが何であるかはわかりません。

は、ここではイメージのため、それらは以下のとおりです。Slider 01Slider 02

答えて

0

は、だから私は、これはだから私は今だけで正常に動作更新VerticalSeekBar作成したonSizeChanged(getWidth(), getHeight(), 0, 0);

を呼び出すことによって解決されていることが分かりました。 私はそれが他の人々に苦労するのを助けることを願っています。ここで

が更新されたクラスです。

輸入android.content.Context。 import android.graphics.Canvas; import android.util.AttributeSet; インポート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); 
    } 
} 
関連する問題