Möglicherweise haben Sie die Ganzzahl-Ressourcen-ID anstelle des Ganzzahl-Farbwerts verwendet. Versuchen Sie, R.color.blue in getResources () zu konvertieren. GetColor (R.color.blue)
milosmns
Drawable drawable = ...; drawable.setColorFilter (ContextCompat.getColor (Kontext, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (zeichnbar); // Hier kann jede Farbe verwendet werden
Flamme3
Antworten:
916
Sie können den Farbton ganz einfach im Code ändern über:
Beachten Sie, dass yourTintin diesem Fall eine "Farbe int" sein muss. Wenn Sie eine Farbressource wie haben R.color.blue, müssen Sie zuerst die Farbe int laden:
Sollte die akzeptierte Antwort sein. Beachten Sie, dass es nur auf XML- ImageViewInstanzen mit AppCompat-Design oder auf AppCompatImageViewUnterklassen funktioniert .
Louis CAD
1
@ ADev schätzen Ihre Lösung, aber die Frage wurde 2013 gestellt und ImageViewCompat und AppCompatImageView Release mit v4-Unterstützung lib 25.4.0 im Juni 2017 bzw. 25.1.0 Dezember 2016 :)
Hardik
1
@ADev natürlich, aber Sie haben in Ihrer Antwort nicht richtig erwähnt, dass Ihre Lösung neu ist und eine neuere Support-Bibliothek 25.4.0 und höher erfordert, da diese Klasse mit einer niedrigeren Version der Support-Bibliothek nicht verfügbar ist, sodass niemand sie finden kann !! !!
Ja, hat auch für mich gearbeitet, ohne den zweiten Parameter. Es kann auch gehenmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad
upvoted und ohne den zweiten Parameter funktioniert es wie Charme. Thx @ toobsco42
Ravi Vaniya
35
@ Hardik hat es richtig. Der andere Fehler in Ihrem Code ist, wenn Sie auf Ihre XML-definierte Farbe verweisen. Sie haben nur die ID an die setColorFilterMethode übergeben, wenn Sie die ID zum Auffinden der Farbressource verwenden und die Ressource an die setColorFilterMethode übergeben sollten. Schreiben Sie Ihren Originalcode unten um.
Wenn diese Zeile in Ihrer Aktivität enthalten ist:
Andernfalls müssen Sie auf Ihre Hauptaktivität verweisen:
Activity main =...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Beachten Sie, dass dies auch für andere Arten von Ressourcen gilt, z. B. Ganzzahlen, Bools, Dimensionen usw. Mit Ausnahme von Zeichenfolgen, die Sie direkt getString()in Ihrer Aktivität verwenden können, ohne dass Sie zuerst aufrufen müssen getResources()(fragen Sie mich nicht warum). .
Ansonsten sieht Ihr Code gut aus. (Obwohl ich die setColorFilterMethode nicht zu sehr untersucht habe ...)
fun ImageView.setTint(@ColorRes colorRes:Int){ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))}
Gibt es eine ähnliche für die Textfarbe von Button / TextView?
Android-Entwickler
Meinst du Textansicht Textfarbe oder Farbton für Textansicht zeichnbar?
Manohar Reddy
Ich meine "Textfarbe". Die Farbe des Textes. Aber ich denke, es ist ziemlich problematisch, da Text für jeden Zustand eine Farbe hat ... Wie kommt es, dass es gut funktioniert, wenn ich die Akzentfarbe einstelle ... Seltsam ... Ist es vielleicht möglich, die Akzentfarbe auf einzustellen? eine bestimmte Schaltfläche (oder TextView) programmgesteuert?
Android-Entwickler
11
Wenn Ihre Farbe hexadezimale Transparenz aufweist, verwenden Sie den folgenden Code.
Da die erste Antwort bei mir nicht funktioniert hat:
//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)));
Dies scheint nur in API 21+ zu funktionieren, aber für mich war das kein Problem. Sie können ein ImageViewCompat verwenden, um dieses Problem zu beheben.
Ab Lollipop gibt es eine Methode ImageView#setImageTintList(), die Sie verwenden können. Der Vorteil besteht darin, dass nicht ColorStateListnur eine einzige Farbe, sondern der Farbton des Bildes berücksichtigt wird .
Auf Pre-Lollipop-Geräten können Sie dasselbe Verhalten erzielen, indem Sie das Zeichenelement tönen und dann als ImageViewBildzeichnungsobjekt festlegen:
Zusätzlich zu ADEV ‚s Antwort (was meiner Meinung nach ist die korrekteste), da die weit verbreiteten Annahme von Kotlin und seinen nützlichen Erweiterungsfunktionen:
fun ImageView.setTint(context:Context,@ColorRes colorId:Int){
val color =ContextCompat.getColor(context, colorId)
val colorStateList =ColorStateList.valueOf(color)ImageViewCompat.setImageTintList(this, colorStateList)}
Ich denke, dies ist eine Funktion, die in jedem Android-Projekt nützlich sein könnte!
Hallo, es funktioniert nicht für Vektor-Drawables. Gibt es eine Problemumgehung für dasselbe?
Manukumar
@Manukumar Verwenden Sie app:srcCompatanstelle von android:srcund fügen Sie vectorDrawables.useSupportLibrary = trueden defaultConfigTeil Ihrer build.gradle-Datei hinzu. Getestet, um auf Kitkat Emulator gut zu funktionieren.
Android-Entwickler
3
Nicht verwenden PoterDuff.Mode, Verwenden Sie setColorFilter()es funktioniert für alle.
Ich bin spät in der Party, aber ich habe meine Lösung oben nicht gesehen. Wir können auch die Tönungsfarbe über setImageResource()einstellen (meine minSdkVersion ist 24).
Zuerst müssen Sie einen Selektor erstellen und im /drawableAsset-Ordner speichern (ich nenne ihn 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"/>
Dann setzen Sie es in Code wie folgt:
val icon = itemView.findViewById(R.id.icon)asImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Kotlin-Lösung mit Erweiterungsfunktion zum Ein- und Ausschalten der Tönung:
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))}
Hier geht es um Farbton! nicht Alpha, das für Transparenz ist.
David
Aber das wirkt letztendlich als Farbton. Sie sollten es selbst versuchen. Dies ist nur eine Möglichkeit, Dinge zu betrachten.
Shubham Chaudhary
@ShubhamChaudhary Ich weiß, das ist spät, aber was ist, wenn das Bild ist png. Wird sich dann der Hintergrund nicht ändern? Auch Alpha und Farbton sind sehr unterschiedlich. Farbton Ist wie Farbersatz, wenn ich mich nicht irre. Keine Straftat beabsichtigt.
Ich
Gutes Argument. Diese Antwort hat in meinem Fall geholfen. Hoffnung passt auch zu den Schuhen eines anderen.
Antworten:
Sie können den Farbton ganz einfach im Code ändern über:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Weißer FarbtonWenn Sie dann Farbtönung wünschen
Für Vektor zeichnbar
UPDATE :
@ADev hat eine neuere Lösung in seiner Antwort hier , aber seine Lösung erfordert eine neuere Support-Bibliothek - 25.4.0 oder höher.
quelle
android:tint
funktioniert auf allen Android-Versionen. Vielleicht redest dudrawableTint
?Die meisten Antworten beziehen sich auf die Verwendung,
setColorFilter
die ursprünglich nicht gestellt wurde.Der Benutzer @Tad hat seine Antwort in die richtige Richtung, aber es funktioniert nur mit API 21+.
Verwenden Sie Folgendes, um den Farbton für alle Android-Versionen festzulegen
ImageViewCompat
:Beachten Sie, dass
yourTint
in diesem Fall eine "Farbe int" sein muss. Wenn Sie eine Farbressource wie habenR.color.blue
, müssen Sie zuerst die Farbe int laden:quelle
ImageView
Instanzen mit AppCompat-Design oder aufAppCompatImageView
Unterklassen funktioniert .Das hat bei mir funktioniert
quelle
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@ Hardik hat es richtig. Der andere Fehler in Ihrem Code ist, wenn Sie auf Ihre XML-definierte Farbe verweisen. Sie haben nur die ID an die
setColorFilter
Methode übergeben, wenn Sie die ID zum Auffinden der Farbressource verwenden und die Ressource an diesetColorFilter
Methode übergeben sollten. Schreiben Sie Ihren Originalcode unten um.Wenn diese Zeile in Ihrer Aktivität enthalten ist:
Andernfalls müssen Sie auf Ihre Hauptaktivität verweisen:
Beachten Sie, dass dies auch für andere Arten von Ressourcen gilt, z. B. Ganzzahlen, Bools, Dimensionen usw. Mit Ausnahme von Zeichenfolgen, die Sie direkt
getString()
in Ihrer Aktivität verwenden können, ohne dass Sie zuerst aufrufen müssengetResources()
(fragen Sie mich nicht warum). .Ansonsten sieht Ihr Code gut aus. (Obwohl ich die
setColorFilter
Methode nicht zu sehr untersucht habe ...)quelle
Nachdem ich alle Methoden ausprobiert hatte und sie bei mir nicht funktionierten.
Ich erhalte die Lösung mit einem anderen PortDuff.MODE.
quelle
Beginnend mit Lollipop gibt es auch eine Tint- Methode für BitmapDrawables, die mit der neuen Palette-Klasse funktioniert:
und
In älteren Android-Versionen können Sie jetzt die DrawableCompat- Bibliothek verwenden
quelle
Versuche dies. Es sollte auf allen Android-Versionen funktionieren, die von der Support-Bibliothek unterstützt werden:
Sie können eine der oben genannten Methoden verwenden, damit es funktioniert.
Weitere interessante Funktionen von DrawableCompat finden Sie in den Dokumenten hier .
quelle
imageView.getBackground()
, um das Drawable zu bekommen, weilimageView.getDrawable()
es null zurückgab.Bessere vereinfachte Erweiterungsfunktion dank ADev
Verwendungszweck:-
quelle
Wenn Ihre Farbe hexadezimale Transparenz aufweist, verwenden Sie den folgenden Code.
Um den Farbton zu löschen
quelle
img
ist vom Typ ImageView.Einfach und einzeilig
quelle
Da die erste Antwort bei mir nicht funktioniert hat:
Dies scheint nur in API 21+ zu funktionieren, aber für mich war das kein Problem. Sie können ein ImageViewCompat verwenden, um dieses Problem zu beheben.
Ich hoffe ich habe jemandem geholfen :-)
quelle
Ab Lollipop gibt es eine Methode
ImageView#setImageTintList()
, die Sie verwenden können. Der Vorteil besteht darin, dass nichtColorStateList
nur eine einzige Farbe, sondern der Farbton des Bildes berücksichtigt wird .Auf Pre-Lollipop-Geräten können Sie dasselbe Verhalten erzielen, indem Sie das Zeichenelement tönen und dann als
ImageView
Bildzeichnungsobjekt festlegen:quelle
quelle
Zum Festlegen des Farbtons für eine Bildansicht programmgesteuert in Android
Ich habe zwei Methoden für Android:
1)
2)
Ich hoffe ich habe jemandem geholfen :-)
quelle
Zusätzlich zu ADEV ‚s Antwort (was meiner Meinung nach ist die korrekteste), da die weit verbreiteten Annahme von Kotlin und seinen nützlichen Erweiterungsfunktionen:
Ich denke, dies ist eine Funktion, die in jedem Android-Projekt nützlich sein könnte!
quelle
Ich habe festgestellt, dass wir den Farbwähler für den Farbton verwenden können:
activity_main.xml:
section_arrowup_color.xml:
quelle
app:srcCompat
anstelle vonandroid:src
und fügen SievectorDrawables.useSupportLibrary = true
dendefaultConfig
Teil Ihrer build.gradle-Datei hinzu. Getestet, um auf Kitkat Emulator gut zu funktionieren.Nicht verwenden
PoterDuff.Mode
, Verwenden SiesetColorFilter()
es funktioniert für alle.quelle
Wie @milosmns sagte, sollten Sie verwenden
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Diese API benötigt einen Farbwert anstelle einer Farbressourcen-ID. Dies ist die Hauptursache dafür, dass Ihre Anweisung nicht funktioniert hat.
quelle
Ich bin spät in der Party, aber ich habe meine Lösung oben nicht gesehen. Wir können auch die Tönungsfarbe über
setImageResource()
einstellen (meine minSdkVersion ist 24).Zuerst müssen Sie einen Selektor erstellen und im
/drawable
Asset-Ordner speichern (ich nenne ihnic_color_white_green_search.xml
).Dann setzen Sie es in Code wie folgt:
quelle
Falls Sie den Selektor auf Ihren Farbton einstellen möchten:
quelle
Kotlin-Lösung mit Erweiterungsfunktion zum Ein- und Ausschalten der Tönung:
quelle
Keine genaue Antwort, aber eine einfachere Alternative:
Hier ist ein Ausschnitt dafür:
quelle
png
. Wird sich dann der Hintergrund nicht ändern? Auch Alpha und Farbton sind sehr unterschiedlich. Farbton Ist wie Farbersatz, wenn ich mich nicht irre. Keine Straftat beabsichtigt.