android - quitar - la pantalla de mi celular se puso gris
Dibujable=> escala de grises (4)
¿Desea hacer esto específicamente de manera programática y no solo con las versiones deshabilitadas de las imágenes? Podría hacer referencia a un dibujable XML, algo como:
<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>
¿Cuál sería la forma correcta de convertir un dibujo en color en una escala de grises (para indicar el estado desactivado)?
EDITAR:
B / W => escala de grises
Algunos comentarios a la respuesta de @intgr.
1. Bitmap.Config.ARGB_8888
para conservar el canal alfa.
2. Un pequeño código extra:
//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);
Aparentemente, puedes usar la clase ColorMatrix
para hacer cualquier tipo de transformación del espacio de color. Tiene un método setSaturation()
que crea fácilmente una transformación de color a escala de grises (saturación de ceros) para usted.
Entonces, puedes usar ese filtro para pintar una nueva copia de la imagen. No he probado esto, pero debería funcionar:
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);
Sé que esta pregunta se hizo hace un tiempo, pero me encontré con una solución más simple que funciona si tiene un Dibujable y solo desea mostrar ese mismo dibujo en escala de grises. No hace falta tener un lienzo o un pintor ...
protected Drawable convertToGrayscale(Drawable drawable)
{
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
Espero que esto ayude también!