Drawable => grayscale

前端 未结 4 1427
清歌不尽
清歌不尽 2020-12-07 23:22

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

EDIT:
B/W => grayscale

相关标签:
4条回答
  • 2020-12-07 23:40

    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">
        <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>
    
    0 讨论(0)
  • 2020-12-07 23:41

    Some coments to the answer of @intgr.
    1. Bitmap.Config.ARGB_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);
    
    0 讨论(0)
  • 2020-12-07 23:46

    I know this question was asked a while ago, but I came across a simpler solution that works if you have a Drawable and you just want to display that same drawable in grayscale. No need to have a canvas or a painter...

    protected Drawable convertToGrayscale(Drawable drawable)
    {
        ColorMatrix matrix = new ColorMatrix();
        matrix.setSaturation(0);
    
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
    
        drawable.setColorFilter(filter);
    
        return drawable;
    }
    

    Hope this helps too!

    0 讨论(0)
  • 2020-12-07 23:47

    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);
    
    0 讨论(0)
提交回复
热议问题