根据 Android 中的 SeekBar 更改可绘制颜色

Change Drawable Color depending on SeekBar in Android

我有一个 ImageView,它显示我的资源文件夹的一个 Drawable。其次,我在 ImageView 下方有一个搜索栏。每个像素的颜色应根据搜索栏的值进行更改。每个像素的颜色应该改变,当seekbar有最大值时,每个像素的'g'和'b'值应该是0,所以只显示红色。如果你降低搜索栏,它应该被转换回来。

我认为这是通过将可绘制对象转换为位图、遍历像素并根据当前搜索栏进度及其当前颜色值更改其颜色值来完成的。

但这只是一个想法。到目前为止,我无法以正确的方式实现这一点。也许你们中的一些人可以给出一个代码示例,或者甚至有更好的解决方案。如果有人能提供帮助,我会很高兴。

编辑:在@pskink 的帮助下(见下面的评论)我能够实现这个东西:

float colorValue = 1 - (float) seekBar.getProgress() / 100; // SeekBar has 100 as maxVal

float[] colorMatrix = {
     1, 0, 0, 0, 0,  //red
     0, colorValue, 0, 0, 0, //green
     0, 0, colorValue, 0, 0,  //blue
     0, 0, 0, 1, 0    //alpha
};

ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
backgroungImageView.setColorFilter(colorFilter);

现在的问题是(很明显)不仅仅是原来的红色部分脱颖而出。一切都是红色的,这也不是我想要的。我要实现的目标是当搜索栏达到最大级别时只显示红色部分。如果 ColorMatrix 也可以做到这一点,那就太好了,但我不确定。有什么建议么?使用 Alpha 通道有帮助吗?

如果有人感兴趣,以下是我在 pskinks 帮助下解决问题的方法:

(SeekBar 仍然有 maxValue 100)

float pr = seekBar.getProgress() / (float) 50;

float[] colorMatrix = {
         1, 0, 0, 0, 0,  //red
         0, 1, 0, 0, 0, //green
         0, 0, 1, 0, 0,  //blue
         pr / 2, -pr, -pr, 1, 0    //alpha
};

ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
backgroungImageView.setColorFilter(colorFilter);

只需尝试使用这些值即可获得其他一些结果。到目前为止,这些是我获得最佳结果的值。