Каким будет правильный способ превратить цвет Drawable в оттенки серого (чтобы указать отключенное состояние)?
EDIT:
B/W = > оттенки серого
Каким будет правильный способ превратить цвет Drawable в оттенки серого (чтобы указать отключенное состояние)?
EDIT:
B/W = > оттенки серого
Я знаю, что этот вопрос был задан некоторое время назад, но я столкнулся с более простым решением, которое работает, если у вас есть 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
для сохранения альфа-канала.
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>