将颜色 Drawable 转换为灰度颜色(以指示禁用状态)的正确方法是什么?
编辑:
黑白 => 灰度
我知道这个问题是不久前被问到的,但我遇到了一个更简单的解决方案,如果你有一个 Drawable 并且你只想以灰度显示相同的 drawable。不需要画布或画家...
protected Drawable convertToGrayscale(Drawable drawable)
{
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
希望这也有帮助!
显然,您可以使用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);
对@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 可绘制对象,例如:
<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>