Drawable =>灰阶

时间:2009-11-24 22:22:17

标签: android drawable

将Drawable颜色变成灰度级的正确方法(表示禁用状态)是什么?

编辑:
B / W =>灰度

4 个答案:

答案 0 :(得分:96)

我知道这个问题刚才问过,但是我遇到了一个更简单的解决方案,如果你有一个Drawable,你只想在灰度级中显示相同的drawable。不需要画布或画家......

protected Drawable convertToGrayscale(Drawable drawable)
{
    ColorMatrix matrix = new ColorMatrix();
    matrix.setSaturation(0);

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);

    drawable.setColorFilter(filter);

    return drawable;
}

希望这也有帮助!

答案 1 :(得分:16)

显然,您可以使用ColorMatrix类进行任何颜色空间转换。它有一个setSaturation()方法,可以轻松地为您创建颜色到灰度的变换(零饱和度)。

因此,您可以使用该过滤器绘制图像的新副本。我没试过,但它应该有效:

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);

答案 2 :(得分:2)

对@intgr答案的一些评论 1. Bitmap.Config.ARGB_8888保留alpha通道 2.一些额外的代码:

//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);

答案 3 :(得分:1)

您是否特别希望以编程方式执行此操作而不仅仅是禁用版本的图像?您可以引用XML drawable,例如:

<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>