Drawable =>灰度

什么是正确的方法来把一个颜色可绘制成一个灰度(表示禁用状态)?

编辑:
B / W =>灰度

Solutions Collecting From Web of "Drawable =>灰度"

我知道这个问题刚刚被问到,但是我遇到了一个更简单的解决scheme,如果你有一个Drawable,那么你只需要在灰度级上显示同样的drawable。 没有必要有一个canvas或画家…

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

希望这也有帮助!

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

因此,您可以使用该filter绘制图像的新副本。 我没有尝试过,但它应该工作:

 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的答案。
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); 

你是否特别想以编程方式进行此操作,而不仅仅是禁用图像的版本? 你可以引用一个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>