Comment définir la teinte pour une vue d’image par programme dans Android?

Besoin de régler la teinte pour une vue image … Je l’utilise de la manière suivante:

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY); 

Mais ça ne change pas …

Vous pouvez changer la teinte, assez facilement en code via:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // teinte blanche

Si vous voulez une teinte de couleur alors

 imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY); 

Pour vecteur dessinable

 imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN); 

MISE À JOUR : @ADev a une solution plus récente dans sa réponse ici mais il semble avoir oublié de mentionner que sa solution nécessite une nouvelle bibliothèque de support 25.4.0 ou supérieure.

La plupart des réponses se réfèrent à l’utilisation de setColorFilter qui n’est pas ce qui a été demandé à l’origine.

L’utilisateur @Tad a sa réponse dans la bonne direction mais cela ne fonctionne que sur API 21+.

Pour définir la teinte sur toutes les versions Android, utilisez ImageViewCompat :

 ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint)); 

Notez que yourTint dans ce cas doit être une “couleur int”. Si vous avez une ressource couleur comme R.color.blue , vous devez d’abord charger la couleur int:

 ContextCompat.getColor(context, R.color.blue); 

@Hardik a raison. L’autre erreur dans votre code est lorsque vous faites référence à votre couleur définie par XML. Vous avez transmis uniquement l’ID à la méthode setColorFilter , lorsque vous devez utiliser l’ID pour localiser la ressource couleur et transmettre la ressource à la méthode setColorFilter . Réécrivez votre code d’origine ci-dessous.

Si cette ligne est dans votre activité:

 imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY); 

Sinon, vous devez référencer votre activité principale:

 Activity main = ... imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY); 

Notez que cela est également vrai pour les autres types de ressources, tels que les entiers, bools, dimensions, etc. Sauf pour ssortingng, pour lequel vous pouvez directement utiliser getSsortingng() dans votre activité sans avoir à appeler au getResources() (don ne me demande pas pourquoi).

Sinon, votre code est correct. (Bien que je n’ai pas trop étudié la méthode setColorFilter …)

Cela a fonctionné pour moi

 mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500)); 

Après avoir essayé toutes les méthodes et qu’elles ne fonctionnaient pas pour moi.

J’obtiens la solution en utilisant un autre PortDuff.MODE.

 imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN); 

À partir de Lollipop, il existe également une méthode de teinte pour BitmapDrawables qui fonctionne avec la nouvelle classe Palette:

public vide setTintList (teinte ColorStateList)

et

public void setTintMode (PorterDuff.Mode tintMode)

Sur les anciennes versions d’Android, vous pouvez maintenant utiliser la bibliothèque DrawableCompat

Essaye ça. Il devrait fonctionner sur toutes les versions d’Android sockets en charge par la bibliothèque de support:

 public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) { return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId)); } public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) { return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color); } public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) { Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable); DrawableCompat.setTint(wrapDrawable, color); DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN); return wrapDrawable; } 

Vous pouvez utiliser l’un des éléments ci-dessus pour le faire fonctionner.

Vous pouvez lire des informations plus intéressantes sur DrawableCompat sur les documents, ici .

 Random random=new Random; ImageView imageView = (ImageView) view.findViewById(R.id.imageView); ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY); imageView.setImageResource(R.drawable.ic_bg_box); imageView.setColorFilter(cf); 

En commençant par Lollipop, il existe une méthode appelée ImageView#setImageTintList() que vous pouvez utiliser … l’avantage étant que ColorStateList est différent d’une seule couleur, rendant ainsi la teinte de l’image sensible à l’état.

Sur les périphériques pré-Lollipop, vous pouvez obtenir le même comportement en teintant le dessinable puis en le définissant comme pouvant être dessiné par l’image ImageView:

 ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector); Drawable drawable = DrawableCompat.wrap(imageView.getDrawable()); DrawableCompat.setTintList(drawable, csl); imageView.setImageDrawable(drawable); 

Simple et une ligne

 imageView.setColorFilter(activity.getResources().getColor(R.color.your_color)); 

J’ai trouvé que nous pouvons utiliser le sélecteur de couleur pour la teinte attr:

 mImageView.setEnabled(true); 

xml:

   

section_arrowup_color.xml:

       

Comme la première réponse n’a pas fonctionné pour moi:

 //get ImageView ImageView myImageView = (ImageView) findViewById(R.id.iv); //colorid is the id of a color defined in values/colors.xml myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid))); 

Cela ne semble fonctionner que dans l’API 21+, mais pour moi ce n’était pas un problème. Vous pouvez utiliser un ImageViewCompat pour résoudre ce problème.

J’espère que j’ai aidé quelqu’un à sortir 🙂

Si votre couleur a une transparence hexadécimale, utilisez le code ci-dessous.

 ImageViewCompat.setImageTintMode(img,PorterDuff.Mode.SRC_ATOP); ImageViewCompat.setImageTintList(img,ColorStateList.valueOf(Color.parseColor("#80000000"))); 

Effacer la teinte

 ImageViewCompat.setImageTintList(img, null); 

Comme @milosmns l’a dit, vous devriez utiliser imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

Cette API nécessite une valeur de couleur au lieu de l’ID de ressource de couleur. C’est la raison pour laquelle votre instruction n’a pas fonctionné.

N’utilisez pas le mode PowerDuff, utilisez setColorFilter, cela fonctionne pour tous.

  ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView); imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read)); 

Pas une réponse exacte mais une alternative plus simple:

  • Placez une autre vue en haut de l’image
  • Modifiez la valeur alpha de la vue comme vous le souhaitez (par programmation) pour obtenir l’effet souhaité.

Voici un extrait pour cela: