Sie müssen den Farbton für eine Bildansicht festlegen ... Ich verwende ihn folgendermaßen:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Aber es ändert sich nicht ...
Sie müssen den Farbton für eine Bildansicht festlegen ... Ich verwende ihn folgendermaßen:
imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);
Aber es ändert sich nicht ...
Antworten:
Sie können den Farbton ganz einfach im Code ändern über:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Weißer Farbton
Wenn Sie dann Farbtönung wünschen
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);
Für Vektor zeichnbar
imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);
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.
android:tint
funktioniert auf allen Android-Versionen. Vielleicht redest du drawableTint
?
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
:
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));
Beachten Sie, dass yourTint
in diesem Fall eine "Farbe int" sein muss. Wenn Sie eine Farbressource wie haben R.color.blue
, müssen Sie zuerst die Farbe int laden:
ContextCompat.getColor(context, R.color.blue);
ImageView
Instanzen mit AppCompat-Design oder auf AppCompatImageView
Unterklassen funktioniert .
Das hat bei mir funktioniert
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
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 die setColorFilter
Methode übergeben sollten. Schreiben Sie Ihren Originalcode unten um.
Wenn diese Zeile in Ihrer Aktivität enthalten ist:
imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
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 setColorFilter
Methode nicht zu sehr untersucht habe ...)
Beginnend mit Lollipop gibt es auch eine Tint- Methode für BitmapDrawables, die mit der neuen Palette-Klasse funktioniert:
public void setTintList (ColorStateList-Farbton)
und
public void setTintMode (PorterDuff.Mode tintMode)
In älteren Android-Versionen können Sie jetzt die DrawableCompat- Bibliothek verwenden
Versuche dies. Es sollte auf allen Android-Versionen funktionieren, die von der Support-Bibliothek unterstützt werden:
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;
}
Sie können eine der oben genannten Methoden verwenden, damit es funktioniert.
Weitere interessante Funktionen von DrawableCompat finden Sie in den Dokumenten hier .
imageView.getBackground()
, um das Drawable zu bekommen, weil imageView.getDrawable()
es null zurückgab.
Bessere vereinfachte Erweiterungsfunktion dank ADev
fun ImageView.setTint(@ColorRes colorRes: Int) {
ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}
Verwendungszweck:-
imageView.setTint(R.color.tintColor)
Wenn Ihre Farbe hexadezimale Transparenz aufweist, verwenden Sie den folgenden Code.
ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));
Um den Farbton zu löschen
ImageViewCompat.setImageTintList(imageView, null);
img
ist vom Typ ImageView.
Einfach und einzeilig
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
Da die erste Antwort bei mir nicht funktioniert hat:
//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)));
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 :-)
Ab Lollipop gibt es eine Methode ImageView#setImageTintList()
, die Sie verwenden können. Der Vorteil besteht darin, dass nicht ColorStateList
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:
ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
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);
Zum Festlegen des Farbtons für eine Bildansicht programmgesteuert in Android
Ich habe zwei Methoden für Android:
1)
imgView.setColorFilter(context.getResources().getColor(R.color.blue));
2)
DrawableCompat.setTint(imgView.getDrawable(),
ContextCompat.getColor(context, R.color.blue));
Ich hoffe ich habe jemandem geholfen :-)
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!
Ich habe festgestellt, dass wir den Farbwähler für den Farbton verwenden können:
mImageView.setEnabled(true);
activity_main.xml:
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_arrowup"
android:tint="@color/section_arrowup_color" />
section_arrowup_color.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/white" android:state_enabled="true"/>
<item android:color="@android:color/black" android:state_enabled="false"/>
<item android:color="@android:color/white"/>
</selector>
app:srcCompat
anstelle von android:src
und fügen Sie vectorDrawables.useSupportLibrary = true
den defaultConfig
Teil Ihrer build.gradle-Datei hinzu. Getestet, um auf Kitkat Emulator gut zu funktionieren.
Nicht verwenden PoterDuff.Mode
, Verwenden Sie setColorFilter()
es funktioniert für alle.
ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));
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.
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 ihn ic_color_white_green_search.xml
).
<!-- Focused and not pressed -->
<item android:state_focused="true"
android:state_pressed="false">
<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>
<!-- Focused and pressed -->
<item android:state_focused="true"
android:state_pressed="true">
<bitmap android:src="@drawable/ic_search"
android:tint="@color/branding_green"/>
</item>
<!-- Default -->
<item android:drawable="@drawable/ic_search"/>
Dann setzen Sie es in Code wie folgt:
val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Falls Sie den Selektor auf Ihren Farbton einstellen möchten:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
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))
}
Keine genaue Antwort, aber eine einfachere Alternative:
Hier ist ein Ausschnitt dafür:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="@dimen/height120"
android:contentDescription="@string/my_description"
android:scaleType="fitXY"
android:src="@drawable/my_awesome_image"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/height120"
android:alpha="0.5"
android:background="@color/my_blue_color"/>
</FrameLayout>
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.