Vertical SeekBar Android,如何用SetProgress()更新滑块位置

时间:2016-08-22 15:30:29

标签: java android slider seekbar

我知道我并不是第一个在Android上遇到VerticalSlider问题的人,但即使我记得在第一时间努力让它工作,这是我第一次有一个部分工作的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.

我非常有信心我的VerticalSlider类很好,因为我已经能够在几年前正确使用它了。所以其余的代码肯定有问题,但我无法找到它可能是什么。

至于这里的图像是:

Slider 01 Slider 02

1 个答案:

答案 0 :(得分: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);
    }
}