0

我有一个ImageView,它显示了我的资源文件夹的Drawable。其次,我在ImageView下面有一个seekbar。每个像素的颜色应该根据seekbar的值而改变。应该改变每个像素的颜色,当seekbar具有最大值时,每个像素的'g'和'b'值应该为0,以便只显示红色。如果您降低搜索栏,则应将其转回。根据Android中的SeekBar更改可绘制颜色

我认为这是通过将drawable转换为位图,遍历像素并根据当前的seekbar进度及其当前颜色值更改其颜色值来完成的。

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

编辑:随着@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通道帮助吗?

+1

查看'ColorMatrixColorFilter' – pskink

+0

非常感谢!这似乎是我需要的东西 – MattLance

+0

我希望你知道如何将它应用到你的'ImageView'上? – pskink

回答

0

如果有人有兴趣,这是我如何解决了pskinks帮助的问题:

(搜索栏仍然有包括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); 

刚玩的价值得到一些其他的结果。到目前为止,这些是我获得最佳结果的价值。

+0

我承认这是一个“黑色魔术“给我,但这些魔术浮点数做的很好:http://pastebin.com/Mdzbb7JY – pskink