有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java垂直SeekBar Android,如何使用SetProgress()更新滑块位置

我知道我不是第一个对安卓上的VerticalSlider有问题的人,但尽管我记得我一开始就努力让它工作,但这是我第一次有一个部分工作的setProgress()

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

蓝线根据我发送的值移动,但“按钮”不移动。它正在移动一点,但根本不跟随蓝线——这是正确的。(如果您对“按钮”和蓝线有更好的定义,请随意编辑。可能是进度线?)

这是我对垂直滑块的代码:

import 安卓.content.Context;
import 安卓.graphics.Canvas;
import 安卓.util.AttributeSet;
import 安卓.util.Log;
import 安卓.view.MotionEvent;
import 安卓.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


共 (1) 个答案

  1. # 1 楼答案

    所以我发现这可以通过调用onSizeChanged(getWidth(), getHeight(), 0, 0);来解决

    因此,我创建了一个更新的VerticalSeekBar,它现在运行良好。 我真的希望它能帮助其他与他们斗争的人

    以下是更新的类:

    导入android。所容纳之物上下文 导入android。图样帆布 导入android。util。属性集; 导入android。util。日志 导入android。看法运动事件; 导入android。小装置。西格巴

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