2013-09-23 9 views
27

Sto cercando di implementare un semplice colorfilter su una vista di immagini per trasformare l'immagine nera in un'immagine bianca. Al fine di ottenere che faccio la seguente:setColorFilter non funziona

weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 
    weatherImg.setImageResource(R.drawable.b_clouded_rain); 

Ho anche provato a cambiare colore nel filtro colore in rosso e nero, ma tutti loro non hanno alcun effetto, quello che sto facendo di sbagliato?

risposta

66

Per quanto mi odio per rispondere alle mie domande ho trovato il problema: Avrei dovuto utilizzato:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); 
+7

'PorterDuff.Mode.SRC_ATOP' è quello usato di default,' weatherImg.setColorFilter (Color.White) 'funzionerà troppo;) – GuilhE

21

Dipende da che tipo di filtraggio che si desidera applicare. Se yout desidera applicare un nuovo colore su un'immagine con trasparenze su di esso, questo è ciò che ha funzionato per me:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); 

Se volete saperne di più su questo filtri PorterDuff, ho trovato un articolo GOOG che mi ha aiutato a capire: http://www.ibm.com/developerworks/java/library/j-mer0918/ dargli una lettura :)

14

Aveva lo stesso problema su Android 6. Risolto utilizzando ImageView.getDrawable().setColorFilter() anziché ImageView.setColorFilter().

2

stavo avendo problemi con setColorFilter su un Samsung S3 in esecuzione 4.3 e l'unico modo ho potuto ottenere il filtro di lavoro è stato applicandola nel metodo draw(Canvas canvas):

public class ColouredDrawable extends BitmapDrawable { 

private ColorFilter mColorFilter; 

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) { 
    super(resources, toTransform); 
    float[] matrix = { 
      0, 0, 0, 0, ((toColour & 0xFF0000)/0xFFFF), 
      0, 0, 0, 0, ((toColour & 0xFF00)/0xFF), 
      0, 0, 0, 0, (toColour & 0xFF), 
      0, 0, 0, 1, 0 }; 
    mColorFilter = new ColorMatrixColorFilter(matrix); 
} 

@Override 
public void draw(Canvas canvas) { 
    setColorFilter(mColorFilter); 
    super.draw(canvas); 
} 

semplice applicazione setColorFilter al didn BitmapDrawable sembra avere alcun effetto

+0

stesso problema su S4 4.4.4. – Simas

+0

Lo stesso qui con 2 dispositivi Samsung su 4.3 e 4.4.4! Questo è veramente cattivo! – sud007

+1

Lo stesso qui su Android prima di Lollipop. Anche NinePatchDrawable è interessato. Ho risolto ignorando la classe drawable e impostando il colorFilter sull'oggetto paint nel metodo draw: @Override public void draw (Canvas canvas) { getPaint(). SetColorFilter (your_colorFilter); super.draw (tela); } – Venator85

1

Per me solo che questa soluzione ha funzionato:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 
image.setImageResource(R.drawable.img); 

filtro si applica se R.drawable.img è immagine di vettore, e non ha alcun effetto per la risorsa raster

3

Usiamo questo codice

Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource)); 
     drawable.mutate(); 
     DrawableCompat.setTint(drawable, getColor(color)); 
     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 

public static int getColor(int id) { 
     return ContextCompat.getColor(getInstance().context, id); 
    } 

public static Drawable getDrawable(int id) { 
     return ContextCompat.getDrawable(getInstance().context, id); 
    } 
0

per Android 4.3 e 4.4, setColorFilter non funziona. Usa invece DrawableCompat.

val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
      context, 
      R.drawable.b_clouded_rain)); 
    DrawableCompat.setTint(drawable, foregroundColor); 
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN) 
      .setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 

    weatherImg.setImageResource(R.drawable.b_clouded_rain);