Vous avez peut-être utilisé l'ID de ressource entier au lieu de la valeur de couleur entière, essayez de convertir R.color.blue en getResources (). GetColor (R.color.blue)
milosmns
Drawable drawable = ...; drawable.setColorFilter (ContextCompat.getColor (context, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (dessinable); // n'importe quelle couleur peut être utilisée ici
flame3
Réponses:
917
Vous pouvez changer la teinte, assez facilement dans le code via:
MISE À JOUR :
@ADev a une solution plus récente dans sa réponse ici , mais sa solution nécessite une bibliothèque de support plus récente - 25.4.0 ou supérieure.
Notez que yourTintdans ce cas doit être une "couleur int". Si vous avez une ressource de couleur comme R.color.blue, vous devez d'abord charger la couleur int:
Doit être la réponse acceptée. Notez qu'il ne fonctionne que sur les ImageViewinstances xml avec le thème AppCompat ou sur les AppCompatImageViewsous-classes.
Louis CAD du
1
@ADev apprécie votre solution mais la question a été posée en 2013 et les versions ImageViewCompat et AppCompatImageView avec prise en charge v4 lib 25.4.0 en juin 2017 et 25.1.0 décembre 2016 respectivement :)
Hardik
1
@ADev bien sûr, mais vous n'avez pas mentionné correctement dans votre réponse que votre solution est nouvelle et nécessite une bibliothèque de support plus récente 25.4.0 et supérieure car avec une version inférieure de support lib cette classe n'est pas disponible, donc personne ne pourrait la trouver !! !! par la façon dont j'ai édité la réponse :) bonne journée ...
ouais, a fonctionné pour moi aussi, sans le deuxième paramètre .. ça peut aussi allermImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad
voté et sans le deuxième paramètre, il fonctionne comme un charme. Thx @ toobsco42
Ravi Vaniya
35
@Hardik a raison. L'autre erreur dans votre code est lorsque vous référencez votre couleur définie par XML. Vous avez transmis uniquement l'ID à la setColorFilterméthode, lorsque vous devez utiliser l'ID pour localiser la ressource couleur et transmettre la ressource à la setColorFilterméthode. Réécriture de votre code d'origine ci-dessous.
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, les bools, les dimensions, etc. À l'exception de la chaîne, que vous pouvez utiliser directement getString()dans votre activité sans avoir à appeler au préalable.getResources() (ne me demandez pas pourquoi) .
Sinon, votre code semble bon. (Même si je n'ai pas setColorFiltertrop étudié la méthode ...)
Meilleure fonction d'extension simplifiée grâce à ADev
fun ImageView.setTint(@ColorRes colorRes:Int){ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))}
Existe-t-il un modèle similaire pour la teinte de texte de Button / TextView?
développeur Android
voulez-vous dire la couleur ou la teinte du texte textview pour textview dessinable?
Manohar Reddy
Je veux dire "teinte du texte". La couleur du texte. Mais je pense que c'est assez problématique, car le texte a une couleur pour chaque état ... Encore une fois, comment cela fonctionne-t-il bien lorsque je définis la couleur d'accentuation ... Impair .... Est-il possible de définir la couleur d'accentuation sur un bouton spécifique (ou TextView), par programme?
développeur Android
12
Essaye ça. Il devrait fonctionner sur toutes les versions d'Android prises en charge par la bibliothèque de support:
Comme la première réponse n'a pas fonctionné pour moi:
//get ImageViewImageView 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, tho.
À partir de Lollipop, il existe une méthode appelée ImageView#setImageTintList()que vous pouvez utiliser ... l'avantage étant qu'il prend une ColorStateListcouleur par opposition à une seule, rendant ainsi la teinte de l'image sensible à l'état.
Sur les appareils pré-Lollipop, vous pouvez obtenir le même comportement en teintant le dessinable puis en le définissant comme ImageViewdessinable de l'image:
Ajout de adev de réponse (qui à mon avis est le plus correct), depuis l'adoption généralisée de Kotlin et ses fonctions d'extension utiles:
fun ImageView.setTint(context:Context,@ColorRes colorId:Int){
val color =ContextCompat.getColor(context, colorId)
val colorStateList =ColorStateList.valueOf(color)ImageViewCompat.setImageTintList(this, colorStateList)}
Je pense que c'est une fonction qui pourrait être utile dans n'importe quel projet Android!
Salut, cela ne fonctionne pas pour les dessins vectoriels..Toute solution de contournement pour la même chose?
Manukumar
@Manukumar Utilisez app:srcCompatau lieu de android:srcet ajoutez-le vectorDrawables.useSupportLibrary = trueà la defaultConfigpartie de votre fichier build.gradle. Testé pour fonctionner correctement sur l'émulateur Kitkat.
développeur Android
3
Ne pas utiliser PoterDuff.Mode, utiliser setColorFilter()ça marche pour tous.
Comme l'a dit @milosmns, vous devez utiliser
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Cette API a besoin d'une valeur de couleur au lieu d'un identifiant de ressource de couleur.C'est la raison principale pour laquelle votre déclaration n'a pas fonctionné.
Je suis en retard dans la fête mais je n'ai pas vu ma solusion ci-dessus. Nous pouvons également définir la couleur de la teinte setImageResource()(ma version minSdk est 24).
Donc, d'abord, vous devez créer un sélecteur et l'enregistrer dans /drawablele dossier d'actifs (je l'appelle ic_color_white_green_search.xml)
<!-- Focused and not pressed --><itemandroid:state_focused="true"android:state_pressed="false"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Focused and pressed --><itemandroid:state_focused="true"android:state_pressed="true"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Default --><itemandroid:drawable="@drawable/ic_search"/>
Ensuite, définissez-le dans un code comme celui-ci:
val icon = itemView.findViewById(R.id.icon)asImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Solution Kotlin utilisant la fonction d'extension, pour définir et désactiver la teinture:
fun ImageView.setTint(@ColorInt color:Int?){if(color ==null){ImageViewCompat.setImageTintList(this,null)return}ImageViewCompat.setImageTintMode(this,PorterDuff.Mode.SRC_ATOP)ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(color))}
il s'agit de teinte! pas alpha qui est pour la transparence.
David
Mais cela finit par agir comme une teinte. Vous devriez l'essayer vous-même. Ce n'est qu'une façon de voir les choses.
Shubham Chaudhary
@ShubhamChaudhary Je sais que c'est tard mais que se passe-t-il si l'image est png. Alors l'arrière-plan ne changera-t-il pas? Alpha et la teinte sont également très différents. La teinte est comme le remplacement de la couleur, si je ne me trompe pas. Aucune infraction prévue. J'essaie juste d'aider :)
KISHORE_ZE
Point valide. Cette réponse a aidé dans mon cas. L'espoir convient aussi aux chaussures de quelqu'un d'autre.
Réponses:
Vous pouvez changer la teinte, assez facilement dans le code via:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Teinte blancheSi vous voulez une teinte de couleur, alors
Pour vecteur dessinable
MISE À JOUR :
@ADev a une solution plus récente dans sa réponse ici , mais sa solution nécessite une bibliothèque de support plus récente - 25.4.0 ou supérieure.
la source
android:tint
fonctionne sur toutes les versions Android. Vous parlez peut-êtredrawableTint
?La plupart des réponses se réfèrent à l'utilisation
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 l'API 21+.
Pour définir la teinte sur toutes les versions d'Android, utilisez
ImageViewCompat
:Notez que
yourTint
dans ce cas doit être une "couleur int". Si vous avez une ressource de couleur commeR.color.blue
, vous devez d'abord charger la couleur int:la source
ImageView
instances xml avec le thème AppCompat ou sur lesAppCompatImageView
sous-classes.Cela a fonctionné pour moi
la source
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik a raison. L'autre erreur dans votre code est lorsque vous référencez votre couleur définie par XML. Vous avez transmis uniquement l'ID à la
setColorFilter
méthode, lorsque vous devez utiliser l'ID pour localiser la ressource couleur et transmettre la ressource à lasetColorFilter
méthode. Réécriture de votre code d'origine ci-dessous.Si cette ligne fait partie de votre activité:
Sinon, vous devez référencer votre activité principale:
Notez que cela est également vrai pour les autres types de ressources, tels que les entiers, les bools, les dimensions, etc. À l'exception de la chaîne, que vous pouvez utiliser directement
getString()
dans votre activité sans avoir à appeler au préalable.getResources()
(ne me demandez pas pourquoi) .Sinon, votre code semble bon. (Même si je n'ai pas
setColorFilter
trop étudié la méthode ...)la source
Après avoir essayé toutes les méthodes, elles n'ont pas fonctionné pour moi.
J'obtiens la solution en utilisant un autre PortDuff.MODE.
la source
À partir de Lollipop, il existe également une méthode de teinte pour BitmapDrawables qui fonctionne avec la nouvelle classe Palette:
et
Sur les anciennes versions d'Android, vous pouvez désormais utiliser la bibliothèque DrawableCompat
la source
Meilleure fonction d'extension simplifiée grâce à ADev
Usage:-
la source
Essaye ça. Il devrait fonctionner sur toutes les versions d'Android prises en charge par la bibliothèque de support:
Vous pouvez utiliser l'un des éléments ci-dessus pour le faire fonctionner.
Vous pouvez lire sur les fonctionnalités plus intéressantes de DrawableCompat sur les documents, ici .
la source
imageView.getBackground()
pour obtenir le drawable, carimageView.getDrawable()
retournait null.Si votre couleur a une transparence hexadécimale, utilisez le code ci-dessous.
Pour effacer la teinte
la source
img
est de type ImageView.Simple et une ligne
la source
Comme la première réponse n'a pas fonctionné pour moi:
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, tho.
J'espère avoir aidé quelqu'un :-)
la source
À partir de Lollipop, il existe une méthode appelée
ImageView#setImageTintList()
que vous pouvez utiliser ... l'avantage étant qu'il prend uneColorStateList
couleur par opposition à une seule, rendant ainsi la teinte de l'image sensible à l'état.Sur les appareils pré-Lollipop, vous pouvez obtenir le même comportement en teintant le dessinable puis en le définissant comme
ImageView
dessinable de l'image:la source
la source
Pour définir la teinte d'une vue d'image par programme dans Android
J'ai deux méthodes pour Android:
1)
2)
J'espère avoir aidé quelqu'un :-)
la source
Ajout de adev de réponse (qui à mon avis est le plus correct), depuis l'adoption généralisée de Kotlin et ses fonctions d'extension utiles:
Je pense que c'est une fonction qui pourrait être utile dans n'importe quel projet Android!
la source
J'ai trouvé que nous pouvons utiliser le sélecteur de couleurs pour l'attrition des teintes:
activity_main.xml:
section_arrowup_color.xml:
la source
app:srcCompat
au lieu deandroid:src
et ajoutez-levectorDrawables.useSupportLibrary = true
à ladefaultConfig
partie de votre fichier build.gradle. Testé pour fonctionner correctement sur l'émulateur Kitkat.Ne pas utiliser
PoterDuff.Mode
, utilisersetColorFilter()
ça marche pour tous.la source
Comme l'a dit @milosmns, vous devez utiliser
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Cette API a besoin d'une valeur de couleur au lieu d'un identifiant de ressource de couleur.C'est la raison principale pour laquelle votre déclaration n'a pas fonctionné.
la source
Je suis en retard dans la fête mais je n'ai pas vu ma solusion ci-dessus. Nous pouvons également définir la couleur de la teinte
setImageResource()
(ma version minSdk est 24).Donc, d'abord, vous devez créer un sélecteur et l'enregistrer dans
/drawable
le dossier d'actifs (je l'appelleic_color_white_green_search.xml
)Ensuite, définissez-le dans un code comme celui-ci:
la source
Si vous souhaitez régler le sélecteur sur votre teinte:
la source
Solution Kotlin utilisant la fonction d'extension, pour définir et désactiver la teinture:
la source
Pas une réponse exacte mais une alternative plus simple:
Voici un extrait pour cela:
la source
png
. Alors l'arrière-plan ne changera-t-il pas? Alpha et la teinte sont également très différents. La teinte est comme le remplacement de la couleur, si je ne me trompe pas. Aucune infraction prévue. J'essaie juste d'aider :)