简体   繁体   中英

Android seekBar change color on value change

I'm using discreteSeekBar . Does anyone know how to change indicator color while scrolling?

When i use:

 class SeekBarOnProgressChangeListener implements DiscreteSeekBar.OnProgressChangeListener {
    int color;

    public Trap5SeekBarOnProgressChangeListener() {

    }

    @Override
    public void onProgressChanged(DiscreteSeekBar seekBar, int value, boolean fromUser) {
        seekBar.setIndicatorPopupEnabled(false);

        if(value == 0) {
            color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarGreen);
        } else if(value < 20) {
            color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarGreen);
        } else if(value < 40) {
            color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarYellow);
        } else {
            color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarRed);
        }

        seekBar.setScrubberColor(color);
        seekBar.setThumbColor(color, color);
    }

}

The color changes since next use of seekBar, not as i want instantly.
Proof: https://s3.postimg.org/to93ovej7/proof.png

Try This way

@Override
            public void onProgressChanged(SeekBar seekBar, int value, boolean fromUser) {
                if(value == 0) {
                    color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarGreen);
                } else if(value < 20) {
                    color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarGreen);
                } else if(value < 40) {
                    color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarYellow);
                } else {
                    color = ContextCompat.getColor(seekBar.getContext(), R.color.colorSneekBarRed);
                }
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                seekBar.setScrubberColor(color);
                seekBar.setThumbColor(color, color);
            }

I succeeded at achieving my goal, this is the solution:

class SeekBarOnProgressChangeListener implements DiscreteSeekBar.OnProgressChangeListener {
    int color;
    int colorGreen;
    int colorYellow;
    int colorRed;

    public SeekBarOnProgressChangeListener() {
        colorGreen = ContextCompat.getColor(getContext(), R.color.colorSneekBarGreen);
        colorYellow = ContextCompat.getColor(getContext(), R.color.colorSneekBarYellow);
        colorRed= ContextCompat.getColor(getContext(), R.color.colorSneekBarRed);
    }

    @Override
    public void onProgressChanged(DiscreteSeekBar seekBar, int value, boolean fromUser) {
        boolean colorChanged = false;

        if(value < 20) {
            if(color != colorGreen){
                color = colorGreen;
                colorChanged = true;
            }
        } else if(value < 40) {
            if(color != colorYellow){
                color = colorYellow;
                colorChanged = true;
            }
        } else {
            if(color != colorRed){
                color = colorRed;
                colorChanged = true;
            }

        }

        if(colorChanged) {
            seekBar.setScrubberColor(color);
            seekBar.setThumbColor(color, color);

            MotionEvent motionEvent = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_UP, 0, 0, 0);
            seekBar.dispatchTouchEvent(motionEvent);
        }

    }

The thumb reappears in a changed color when new color is set, it is good enough for me, but if anyone has a solution that changes thumb color without recreating it, please post the solution here.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM