Как сделать цветовой градиент в SeekBar?
Я хочу использовать SeekBar (то есть Java Slider старой школы) в палитре градиента цвета. Я видел такие примеры, но все они требуют создания новых классов и тому подобного. Должен быть способ изменить или переопределить исходные классы. Или просто замените фон градиентом.
3 ответа
Я понял, вот как ты это делаешь.
Вы создаете стандартную панель поиска в своем XML.
<SeekBar
android:id="@+id/seekbar_font"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10px"
android:layout_below="@id/color_font_text"
android:max="100"
android:progress="50"></SeekBar>
Затем вы настраиваете панель поиска в вашем onCreate(), создавая boxShape, а затем принудительно добавляете линейный градиент внутри него.
LinearGradient test = new LinearGradient(0.f, 0.f, 300.f, 0.0f,
new int[] { 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFF00FFFF,
0xFFFF0000, 0xFFFF00FF, 0xFFFFFF00, 0xFFFFFFFF},
null, TileMode.CLAMP);
ShapeDrawable shape = new ShapeDrawable(new RectShape());
shape.getPaint().setShader(test);
SeekBar seekBarFont = (SeekBar)findViewById(R.id.seekbar_font);
seekBarFont.setProgressDrawable( (Drawable)shape );
Вот изображение текущего кода выше SeekBar Color Gradient
Это в дополнение к решению, предоставленному с использованием LinearGradient. Попробуйте эту логику для перевода прогресса в rgb:
lineColorSeekbar.setMax(256*7-1);
lineColorSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){
int r = 0;
int g = 0;
int b = 0;
if(progress < 256){
b = progress;
} else if(progress < 256*2) {
g = progress%256;
b = 256 - progress%256;
} else if(progress < 256*3) {
g = 255;
b = progress%256;
} else if(progress < 256*4) {
r = progress%256;
g = 256 - progress%256;
b = 256 - progress%256;
} else if(progress < 256*5) {
r = 255;
g = 0;
b = progress%256;
} else if(progress < 256*6) {
r = 255;
g = progress%256;
b = 256 - progress%256;
} else if(progress < 256*7) {
r = 255;
g = 255;
b = progress%256;
}
lineColorSeekbar.setBackgroundColor(Color.argb(255, r, g, b));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
Вопрос довольно старый, но, возможно, это кому-то нужно (ответ только с кодом XML):
<SeekBar
android:id="@+id/sb_saturation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxHeight="4dp"
android:minHeight="4dp"
android:progressDrawable="@drawable/style_seekbar_saturation" />
а также
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress">
<shape>
<corners android:radius="2dp" />
<gradient
android:endColor="@color/custom_green"
android:startColor="@android:color/black" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<shape android:shape="rectangle">
<size android:height="3dp" />
<solid android:color="@color/transparent" />
</shape>
</item>
</layer-list>