2013-05-02 75 views
1

我正在编写一个应用程序,我必须在其中执行一些即时图像变化。在StateListDrawable中应用颜色过滤器不起作用

我所要做的就是在屏幕上放置一个drawable,给它一个花哨的颜色,可以随时更改并使其可点击(使用StateListDrawable)。

对于在飞行中的颜色变化,我正在考虑使用PorterDuffColorFilter,我将其应用于drawable上。然而,将滤镜添加到StateListDrawable似乎是一个坏主意,因为滤色器被删除。 但后来我想出了这个解决方案,我发现某处的SO:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    Bitmap one = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable, options); 
    Bitmap oneCopy = Bitmap.createBitmap(one.getWidth(), one.getHeight(), Bitmap.Config.ARGB_8888); 

    Canvas c = new Canvas(oneCopy); 
    Paint p = new Paint(); 
    p.setColorFilter(new PorterDuffColorFilter(onTheFlyColorResId, PorterDuff.Mode.SRC_ATOP)); 
    c.drawBitmap(one, 0, 0, p); 

    ... 

    sld.addState(new int[]{-stateFocused}, new BitmapDrawable(context.getResources(), oneCopy)); 

这类作品,但有一个棘手的事情。下面的图片是结果,而R.drawable.my_drawable是一个PNG文件,它周围是3px的透明边框。

The problem...

如果我只是在初始的绘制我得到了全黑色的图像与侧面部分TRANSPARANT像素象下面这样:

sld.addState(new int[]{-stateFocused}, context.getResources().getDrawable(R.drawable.my_drawable)); 

这是结果:

The result I want but without the color filter

所以我在想,oneCopy bitmat或canva上的图形可能有问题S,所以我的代码改成这样:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    Bitmap one = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable, options); 

    ... 

    sld.addState(new int[]{-stateFocused}, new BitmapDrawable(context.getResources(), one)); 

所以绘制的没有更多的转换,只是读它作为一个位图,将其转化为可提拉再次也导致一个奇怪的结果:

Also not good...

而我只想要的是我的自定义颜色应用的第二个图像。

有没有人有一个想法,为什么我得到了奇怪的淡入淡出效果左右图像?

回答

0

要应用彩色滤镜并更改可绘制的颜色,我发现使用灰度/白色的基本drawable最好与Mode.MULTIPLY PorterDuff滤镜结合使用。

如果你想这样做的代码是好的,但在我看来,最好的组合是有一个XML定义的TextView与白色灰度背景,然后在代码中,你可以更改背景颜色:

<TextView 
    android:id="@+id/mybox" 
    . . . 
    android:background="@drawable/box" 

可绘制的框可以是任何东西,PNG或另一个XML,定义了填充纯色白色的矩形形状。

int onTheFlyColor = 0xAARRGGBB; or getResources().getColor(R.color.red); 
TextView tv = findViewById(R.id.mybox); 
tv.getBackground().setColorFilter(onTheFlyColor, Mode.MULTIPLY); 
+0

这的确应该工作(类似于测试的东西),但我的问题是申请使用StateListDrawable彩色滤光片...... – dirkvranckaert 2013-05-07 05:23:04

+0

@dirkvranckaert我想你不是说要改变“对飞”,但颜色只是为了'StateListDrawable'中的每个状态都有不同的颜色。在飞行中,如果用户或某种算法在每次状态更改时选择一种颜色,但如果我理解正确,则每种状态的颜色都是已知的并且是硬编码的。 – ilomambo 2013-05-07 06:11:56

+0

我确实有一个StateListDrawable。如果选择了sld,我会显示一个'硬编码'的drawable。在另一种情况下(如果没有选中,只是显示)我想要显示黑色可绘制,但用彩色滤镜将黑色可绘制的颜色更改为用户可以在显示按钮之前的活动中选择的颜色... – dirkvranckaert 2013-05-08 10:03:28