J'essaie d'implémenter un filtre de couleur simple sur une image pour transformer l'image noire en image blanche. Pour y parvenir, je fais ce qui suit:
weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
weatherImg.setImageResource(R.drawable.b_clouded_rain);
J'ai également essayé de changer la couleur du filtre de couleur en rouge et blanc, mais toutes n'ont aucun effet. Qu'est-ce que je fais mal?
Même si je déteste répondre à mes propres questions, j’ai trouvé le problème:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
Cela dépend du type de filtrage que vous souhaitez appliquer. Si vous souhaitez appliquer une nouvelle couleur à une image comportant des transparents, voici ce qui a fonctionné pour moi:
weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);
Si vous voulez en savoir plus sur ces filtres PorterDuff, j'ai trouvé un article de goog qui m'a aidé à comprendre: http://www.ibm.com/developerworks/Java/library/j-mer0918/ lisez-le: )
Avait le même problème sur Android 6. Résolu en utilisant ImageView.getDrawable().setColorFilter()
au lieu de ImageView.setColorFilter()
.
Nous utilisons ce code
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);
}
Je rencontrais des problèmes avec setColorFilter
sur un Samsung S3 sous 4.3 et la seule façon pour que le filtre fonctionne est de l'appliquer dans la méthode 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);
}
L'application simple setColorFilter
à BitmapDrawable ne semble pas avoir d'effet.
Pour moi seule cette solution a fonctionné:
image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);
le filtre s'applique si R.drawable.img
est une image vectorielle et n'a aucun effet sur les ressources raster
Pour moi, appeler simplement setColorFilter()
sur la ImageView
ne fonctionnait pas.
imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) //didnt work on 21, only 22+
Pour une raison quelconque, dans l'API 21, la seule façon pour que setColorFilter()
fonctionne correctement était de publier la modification dans la file d'attente des messages de vues.
imageView.post { imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) } //this works on 21+
Pour Android 4.3 et 4.4, setColorFilter ne fonctionne pas. Utilisez DrawableCompat à la place.
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);