views:

536

answers:

3

What would be the right way to turn a color Drawable into a grayscale one (to indicate disabled state)?

EDIT:
B/W => grayscale

+2  A: 

Apparently you can use the ColorMatrix class to do any sort of color-space transformations. It has a setSaturation() method that easily creates a color-to-grayscale transformation (zeroes saturation) for you.

So, you can use that filter to paint a new copy of the image. I haven't tried this, but it should work:

Bitmap grayscaleBitmap = Bitmap.createBitmap(
    colorBitmap.getWidth(), colorBitmap.getHeight(),
    Bitmap.Config.RGB_565);

Canvas c = new Canvas(grayscaleBitmap);
Paint p = new Paint();
ColorMatrix cm = new ColorMatrix();

cm.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm);
p.setColorFilter(filter); 
c.drawBitmap(colorBitmap, 0, 0, p);
intgr
A: 

Are you specifically wanting to do this programatically and not just with disabled versions of the images? You could reference an XML drawable, something like:

<selector xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    <item android:state_window_focused="false" android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_window_focused="false" android:state_enabled="false"
        android:drawable="@drawable/btn_default_normal_disable" />
    <item android:state_pressed="true" 
        android:drawable="@drawable/btn_default_pressed" />
    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/btn_default_selected" />
    <item android:state_enabled="true"
        android:drawable="@drawable/btn_default_normal" />
    <item android:state_focused="true"
        android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item
         android:drawable="@drawable/btn_default_normal_disable" />
</selector>
fiXedd
Yeah, I want to do it on per-instance basis. Thanks for the snippet though.
alex
+1  A: 

Some coments to the answer of @intgr.
1. Bitmap.Config.RGB_8888 to preserve the alpha-channel.
2. A little extra code:

//remember, you are converting a .png image, as opposed to a Drawable defined in .xml  
Bitmap colorBitmap = ((BitmapDrawable)drawable).getBitmap();    
// the code by intgr  
Drawable grayscaleDrawable = new BitmapDrawable(grayscaleBitmap);
alex