如何在Android中以编程方式更改SeekBar的颜色?

12

我为我的应用程序制作了一个均衡器,但我不确定如何更改滑动条的拇指和进度颜色。默认情况下似乎是粉红色的,这与我的应用美学风格不符。

 SeekBar seekBar = new SeekBar(this);

        seekBar.setId(i);

        seekBar.setLayoutParams(layoutParams);
        seekBar.setMax(upperEqualizerBandLevel - lowerEqualizerBandLevel);

        seekBar.setProgress(mEqualizer.getBandLevel(equalizerBandIndex));
        //seekBar.setBackgroundColor(Color.DKGRAY);
        //seekBar.setDrawingCacheBackgroundColor(Color.DKGRAY);

要更改布局,请访问https://dev59.com/hmQo5IYBdhLWcg3wUN3Y。 - CoolMind
9个回答

21

要更改Seekbar拇指的颜色,请在style.xml中创建一个新样式。

<style name="SeekBarColor"
  parent="Widget.AppCompat.SeekBar"> 
  <item name="colorAccent">@color/your_color</item> 
</style>

最后在布局中:

<SeekBar
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:theme="@style/SeekBarColor" />

要更改 Seekbar 进度颜色,请在Java类中使用以下内容。

seekBar.getProgressDrawable().setColorFilter("yourcolor", PorterDuff.Mode.MULTIPLY);

这两种方法都适用于API> 16。

编辑

通过Java代码更改SeekBar拇指颜色。

 seekBar.getProgressDrawable().setColorFilter(getResources().getCo‌​lor(R.color.your_color‌​), PorterDuff.Mode.SRC_ATOP);

谢谢。我使用后者,因为我通过编程方式创建了均衡器的拖动条。进度颜色会改变,但我无法更改拇指。有什么办法吗? - Alpoe
答案的第一部分说明了如何更改SeekBar拇指的颜色。我已经添加了这段代码,因为它可以在更广泛的API范围内运行。 - Abhi
请检查已编辑的答案,其中包含更改SeekBar拇指颜色的Java代码(仅适用于Android 5及以上版本)。 - Abhi
高API级别中已弃用 - porya74

7

使用样式是一个好主意,但如果您想以编程方式分配颜色,它并不提供太多的灵活性。 我建议:

//对于进度 seekBar.getProgressDrawable().setColorFilter(mThemeColor,PorterDuff.Mode.SRC_ATOP); //对于拇指句柄 seekBar.getThumb().setColorFilter(mThemeColor,PorterDuff.Mode.SRC_ATOP);


1
您可以像这样通过编程更改seekbar拇指和进度颜色:
   seekBar.getProgressDrawable().setColorFilter(Utils.getAccentColor(this), PorterDuff.Mode.SRC_IN);
   seekBar.getThumb().setColorFilter(Utils.getAccentColor(this), PorterDuff.Mode.SRC_IN);

1
您可以通过代码轻松更改它,
例如:
seekbar.setProgressTintList(ColorStateList.valueOf(Color.parseColor(#000000)));

或者

seekbar.setProgressTintList(ColorStateList.valueOf(Color.RED));

希望这对未来的某个人有所帮助。

1
这很有帮助。 - Ashwin

0
你需要这样调用你的 seekbar。
SeekBar newSeek = new SeekBar(this, null, R.style.YOUR_NEW_STYLE);

在此,YOUR_NEW_STYLE 将定义您想要的 SeekBar 的颜色。


0

试试这个:

seekBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.mcolor), PorterDuff.Mode.MULTIPLY);

这不会改变大拇指。 - Tim

0

使用 Kotlin 版本,且不使用已弃用的方法:

val colorFilter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(
    Resources.getSystem().getColor(R.color.your_color, null),
    BlendModeCompat.SRC_ATOP
)

// SeekBar progress color
seekBar.progressDrawable.colorFilter = colorFilter
// SeekBar thumb handle color
seekBar.thumb.colorFilter = colorFilter

0

再多一點桃色的答案

public static void setSeekBarColor(SeekBar seekBar, int color) {
    seekBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
    seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}

-1
    //seekBar.setBackgroundColor(Color.DKGRAY);
    //seekBar.setDrawingCacheBackgroundColor(Color.DKGRAY);

在Android SDK中有一些视图(ProgressBar是另一个例子),你必须使用图形颜色过滤器来改变颜色,而不是改变背景/前景源颜色。

找到.setColorFilter()方法,将你的源颜色与一些PorterDuff过滤器一起提供给它,比如.Mode.MULTIPLY(取决于你最喜欢的过滤器模式),然后就可以了。

例如:

seekBar.setColorFilter(new PorterDuffColorFilter(srcColor,PorterDuff.Mode.MULTIPLY));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接