style studio personalizado discrete java android seekbar

java - studio - Cómo configurar el mínimo y máximo valor de seekbar



seekbar discrete android (12)

Copia esta clase y usa la barra de búsqueda personalizada:

public class MinMaxSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener { private OnMinMaxSeekBarChangeListener onMinMaxSeekBarChangeListener = null; private int intMaxValue = 100; private int intPrgress = 0; private int minPrgress = 0; public int getIntMaxValue() { return intMaxValue; } public void setIntMaxValue(int intMaxValue) { this.intMaxValue = intMaxValue; int middle = getMiddle(intMaxValue, minPrgress); super.setMax(middle); } public int getIntPrgress() { return intPrgress; } public void setIntPrgress(int intPrgress) { this.intPrgress = intPrgress; } public int getMinPrgress() { return minPrgress; } public void setMinPrgress(int minPrgress) { this.minPrgress = minPrgress; int middle = getMiddle(intMaxValue, minPrgress); super.setMax(middle); } private int getMiddle(int floatMaxValue, int minPrgress) { int v = floatMaxValue - minPrgress; return v; } public MinMaxSeekBar(Context context, AttributeSet attrs) { super(context, attrs); this.setOnSeekBarChangeListener(this); } public MinMaxSeekBar(Context context) { super(context); this.setOnSeekBarChangeListener(this); } @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { intPrgress = minPrgress + i; onMinMaxSeekBarChangeListener.onMinMaxSeekProgressChanged(seekBar, intPrgress, b); } @Override public void onStartTrackingTouch(SeekBar seekBar) { onMinMaxSeekBarChangeListener.onStartTrackingTouch(seekBar); } @Override public void onStopTrackingTouch(SeekBar seekBar) { onMinMaxSeekBarChangeListener.onStopTrackingTouch(seekBar); } public static interface OnMinMaxSeekBarChangeListener { public void onMinMaxSeekProgressChanged(SeekBar seekBar, int i, boolean b); public void onStartTrackingTouch(SeekBar seekBar); public void onStopTrackingTouch(SeekBar seekBar); } public void setOnIntegerSeekBarChangeListener(OnMinMaxSeekBarChangeListener floatListener) { this.onMinMaxSeekBarChangeListener = floatListener; } }

Esta clase continúa el método public void setMin(int minPrgress) para configurar el valor mínimo de la Barra de búsqueda

Tengo una barra de búsqueda y trato de establecer el valor de 60 a 180 para uno y de 40 a 190 para el segundo en el paso 1.

sb1 = (SeekBar) findViewById(R.id.progresss); sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub //int inVal = Integer.parseInt(String.valueOf(seekBar.getProgress())); //inVal =+ 70; //Toast.makeText(getApplicationContext(), String.valueOf(inVal),Toast.LENGTH_LONG).show(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { // TODO Auto-generated method stub progress =+ 70; Toast.makeText(getApplicationContext(), String.valueOf(progress),Toast.LENGTH_LONG).show(); } });

no está trabajando. ¿Alguna de idea de cómo arreglarlo?


El valor mínimo siempre comenzará en cero y no se puede hacer nada al respecto. Pero puedes cambiar su valor cuando el usuario comience a desplazarlo.

Aquí establezco el valor máximo en 64. Estos cálculos son simples: quiero que el usuario escoja un tiempo de 15 minutos a 16 horas, y él elige uno de cada 15 minutos a 16 horas, ¿está claro? Lo sé, muy simple :)

SeekBar seekBar = (SeekBar) dialog.findViewById(R.id.seekBar); seekBar.setMax(64); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { float b; @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { float des = (float) progress / 4; b = des; hours.setText(des + " hours"); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { hoursSelected = b; } });


Establecer seekbar máximo y mínimo valor

seekbar have method that setmax(int position) and setProgress(int position)

Gracias


La Barra de búsqueda tiene métodos para establecer valores máximos, pero no para el valor mínimo. Aquí escribo un código para establecer el valor mínimo de la barra de búsqueda cuando agregamos este código, sus valores de barra de búsqueda no menos que el valor de mía.

/ * Este método llama después de buscar cambio de valor de barra * /

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { /* Check the current seekbar value is greather than min value*/ if (progress < MIN_VALUE) { /* if seek bar value is lesser than min value then set min value to seek bar */ seekBar.setProgress(MIN_VALUE); } }


La forma más fácil de establecer un valor mínimo y máximo en una barra de búsqueda para mí: si desea valores mín = 60 a máx = 180, esto es igual a min = 0 max = 120. Así que en la propiedad del conjunto xml seekbar:

android:max="120"

min será siempre 0 .

Ahora solo necesita hacer lo que está haciendo, agregar la cantidad para obtener el valor traducido en cualquier cambio, en este caso +60.

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int translatedProgress = progress + 60; } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });

Tenga cuidado con la propiedad seekbar android: progress, si cambia el rango, debe volver a calcular su progreso inicial. Si desea 50%, max / 2, en mi ejemplo 120/2 = 60;


Mira mi respuesta here

Utilicé solo el oyente para SeekBar y funciona bien.


No hay ninguna opción para establecer un valor mínimo o máximo en la barra de búsqueda, por lo que puede usar una fórmula aquí para escalar su valor.

Desired_value = ( progress * ( Max_value - Min_value) / 100 ) + Min_value

He probado esta fórmula en muchos ejemplos. En su ejemplo, si la barra de progreso es la media (es decir, progreso = 50) y su Min_val y Max_val son 60 y 180 respectivamente, entonces esta fórmula le dará el Desired_value ''120''.


Otra solución para manejar este caso es crear un Seekbar personalizado, para aprovechar la conversión del valor real y el progreso de SeekBar cada vez:

import android.content.Context import android.util.AttributeSet import android.widget.SeekBar // // Require SeekBar with range [Min, Max] and INCREMENT value, // However, Android Seekbar starts from 0 and increment is 1 by default, Android supports min attr on API 26, // To make a increment & range Seekbar, we can do the following conversion: // // seekbar.setMax((Max - Min) / Increment) // seekbar.setProgress((actualValue - Min) / Increment) // seekbar.getProgress = Min + (progress * Increment) // // The RangeSeekBar is responsible for handling all these logic inside the class. data class Range(val min: Int, val max: Int, private val defaultIncrement: Int) { val increment = if ((max - min) < defaultIncrement) 1 else defaultIncrement } internal fun Range.toSeekbarMaximum(): Int = (max - min) / increment class RangeSeekBar: SeekBar, SeekBar.OnSeekBarChangeListener { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) var range: Range = Range(0, 100, 1) set(value) { field = value max = value.toSeekbarMaximum() } var value: Int = 0 get() = range.min + progress * range.increment set(value) { progress = (value - range.min) / range.increment field = value } var onSeekBarChangeListenerDelegate: OnSeekBarChangeListener? = this override fun setOnSeekBarChangeListener(l: OnSeekBarChangeListener?) { onSeekBarChangeListenerDelegate = l super.setOnSeekBarChangeListener(this) } override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { onSeekBarChangeListenerDelegate?.onProgressChanged(seekBar, value, fromUser) } override fun onStartTrackingTouch(seekBar: SeekBar?) { onSeekBarChangeListenerDelegate?.onStartTrackingTouch(seekBar) } override fun onStopTrackingTouch(seekBar: SeekBar?) { onSeekBarChangeListenerDelegate?.onStopTrackingTouch(seekBar) } }

Entonces en tu fragmento,

// init range_seekbar.range = Range(10, 110, 10) range_seekbar.value = 20 // observe value changes range_seekbar.userChanges().skipInitialValue().subscribe { println("current value=$it") }

Palabras clave: Kotlin, gama SeekBar, Rx


Puede establecer el valor máximo para su barra de búsqueda usando este código:

sb1.setMax(100);

Esto establecerá el valor máximo para su barra de búsqueda.

Pero no puede establecer el valor mínimo, pero sí puede hacer algo de aritmética para ajustar el valor. Use la aritmética para ajustar el valor requerido por su aplicación.

Por ejemplo, suponga que tiene valores de datos de -50 a 100 que desea mostrar en el SeekBar. Establezca el máximo de SeekBar en 150 (100 - (- 50)), luego agregue 50 al valor en bruto para obtener el número que debe usar al configurar la posición de la barra.

Puede obtener más información a través de este link .


Sé que la respuesta ya está elegida y me demoré un poco en responder, pero quería compartir mi respuesta.

No puede establecer el valor min de un SeekBar (siempre 0) y no puede establecer el valor de step de un SeekBar (siempre 1).

Si desea establecer el valor de 60 a 180 con un paso de 1, esta es la forma de hacerlo:

int step = 1; int max = 180; int min = 60; // Ex : // If you want values from 3 to 5 with a step of 0.1 (3, 3.1, 3.2, ..., 5) // this means that you have 21 possible values in the seekbar. // So the range of the seek bar will be [0 ; (5-3)/0.1 = 20]. seekbar.setMax( (max - min) / step ); seekbar.setOnSeekBarChangeListener( new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) {} @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // Ex : // And finally when you want to retrieve the value in the range you // wanted in the first place -> [3-5] // // if progress = 13 -> value = 3 + (13 * 0.1) = 4.3 double value = min + (progress * step); } } );

Pongo otro ejemplo dentro del código para que entiendas las matemáticas.

Espero te ayude


private static final int MIN_METERS = 100; private static final int JUMP_BY = 50; metersText.setText(meters+""); metersBar.setProgress((meters-MIN_METERS)); metersBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { progress = progress + MIN_METERS; progress = progress / JUMP_BY; progress = progress * JUMP_BY; metersText.setText((progress)+""); } }); }


seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int MIN = 5; if (progress < MIN) { value.setText(" Time Interval (" + seektime + " sec)"); } else { seektime = progress; } value.setText(" Time Interval (" + seektime + " sec)"); } });