将Drawable颜色变成灰度级的正确方法(表示禁用状态)是什么?
编辑:
B / W =>灰度
答案 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>