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

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top