2009-11-24 15 views
18

¿Cuál sería la forma correcta de convertir un color Drawable en uno de escala de grises (para indicar estado deshabilitado)?Drawable => escala de grises

EDIT:
B/W => escala de grises

Respuesta

91

Sé que esta pregunta se hizo hace un tiempo, pero me encontré con una solución más simple que funciona si tiene un Disponibles y lo que desea es mostrar esa misma estirable en escala de grises No es necesario 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!

+0

wow, tan simple, ¡tan bueno! – tacone

+0

Hombre, eres un mago, gracias un pan! – Sipty

+1

¡Buen consejo! Algo interesante es que si ejecuta este método al pasar ContextCompat.getDrawable (context, R.drawable.myId); la próxima vez que necesite obtener el mismo dibujo, el filtro de color ya está configurado. Por mi parte, necesito quitar el filtro de color para recuperar el color en mi drawable :) – Tobliug

17

Al parecer, usted puede utilizar la clase ColorMatrix para hacer cualquier tipo de transformaciones de espacio de color. Tiene un método setSaturation() que crea fácilmente una transformación de color a escala de grises (pone a cero la saturación) por usted.

Entonces, puede 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); 
1

¿Usted está queriendo específicamente para hacer esto mediante programación y no sólo con las versiones con discapacidad de las imágenes? Puede hacer referencia a un XML dibujable, 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> 
+0

Sí, quiero hacerlo en cada instancia. Gracias por el fragmento sin embargo. – yanchenko

3

Algunos comentarios a la respuesta de @intgr.
1. Bitmap.Config.ARGB_8888 para conservar el canal alfa.
2. Un poco código adicional:

//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); 
+1

Small Typo: Bitmap.Config.RGB_8888 debe ser Bitmap.Config.ARGB_8888. Funciona bien entonces, gracias. – Minsky

Cuestiones relacionadas