Drawable => scala di grigi
Domanda
Quale sarebbe il modo giusto per trasformare un Drawable colore in una scala di grigi (per indicare lo stato disattivato)?
EDIT:
B / W => scala di grigi
Soluzione
So che questa domanda è stato chiesto qualche tempo fa, ma mi sono imbattuto in una soluzione più semplice che funziona se si dispone di un Drawable e si vuole solo visualizzare lo stesso drawable in scala di grigi. Non c'è bisogno di avere una tela o un pittore ...
protected Drawable convertToGrayscale(Drawable drawable)
{
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
Spero che questo aiuti anche!
Altri suggerimenti
A quanto pare è possibile utilizzare la classe ColorMatrix
di fare qualsiasi tipo di trasformazioni colore-spazio. Ha un metodo di setSaturation()
che crea facilmente una trasformazione del colore-to-scala di grigi (zeri saturazione) per voi.
Quindi, è possibile utilizzare tale filtro per dipingere una nuova copia dell'immagine. Non ho provato questo, ma dovrebbe funzionare:
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);
Alcuni coments alla risposta di @intgr.
1. Bitmap.Config.ARGB_8888
per preservare il canale alfa.
2. Un po 'di codice in più:
//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);
Stai specificamente voglia di fare questo a livello di codice e non solo con le versioni disabili delle immagini? Si potrebbe fare riferimento a un disegnabile XML, qualcosa come:
<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>