Zeichenbare Tönung für API <21


83

Ist es möglich, zeichnbare Tönungen für API <21 durchzuführen?

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary" />

Funktioniert einwandfrei, aber nur für Geräte mit API21. Gibt es eine Problemumgehung für Geräte mit niedrigerer API oder AppCompat-Unterstützung? Kann nichts finden.

Antworten:


106

Verwenden Sie das AppCompatImageViewGleiche so:

<android.support.v7.widget.AppCompatImageView
        android:id="@+id/my_appcompat_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_image"
        android:tint="#636363"
    />

Stellen Sie sicher, dass Sie die neueste appcompat-v7Version Ihrer App haben build.gradle.

Beispiel: compile 'com.android.support:appcompat-v7:25.0.0'in Ihrer App build.gradle.


66
Aus den AppCompatImageViewDokumenten: This will automatically be used when you use ImageView in your layouts. You should only need to manually use this class when writing custom views. developer.android.com/reference/android/support/v7/widget/… Die Verwendung des Normalen ImageViewim Layout sollte also einwandfrei funktionieren.
Nimrod Dayan

1
Wie oben von @NimrodDayan erwähnt, sollte dies nicht notwendig sein. Ich erhalte Berichte über Android: Tint funktioniert jedoch nicht auf einem Samsung A5 und Moto G (mit Appcompat-v7: 23.4.0), sodass ImageViews auf einigen Geräten möglicherweise nicht ordnungsgemäß ersetzt werden.
Stephen Kidson

@StephenKidson, ich verwende dieselbe Version von Appcompat und bin auch auf einem Gerät einer unbekannten Marke auf dasselbe Problem gestoßen. Hast du es geschafft, das zu lösen? Ich frage mich, ob darüber ein Fehler gemeldet wurde ...
Nimrod Dayan

4
Dies funktionierte unter Emulator Android 4.0 mit appcompat-v7: 25.1.0 nicht.
Peterdk

4
AppCompatImageView kann nicht in einem Widget verwendet werden. Verwenden Sie setColorFilter in der ImageView.
Massimo

45

Sie können dies mit Quellcode erreichen. Bisher wurde das Abtönen von nicht unterstützt DrawableCompat. Ab der Support-Bibliothek 22.1 können Sie dies tun, müssen dies jedoch folgendermaßen tun:

Drawable normalDrawable = getResources().getDrawable(R.drawable.drawable_to_tint);
Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
DrawableCompat.setTint(wrapDrawable, getResources().getColor(R.color.colorPrimaryLight));

18
Wenn Sie das Abtönen von <21 APIs unterstützen müssen, möchten Sie wahrscheinlich ContextCompat.getColor()stattdessen verwenden getResources().getColor().
Sevastyan Savanyuk

22

Könnten Sie nicht einfach eine ImageView verwenden, um Ihr Drawable anzuzeigen? android:tintfunktioniert gut auf älteren API-Ebenen.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary"
    />

2
Ich verwende ImageView - um das Symbol darin anzuzeigen. Diese Symbole sind Teil von Elementen in meiner Navigationsleiste. Und das ausgewählte Element in der Navigationsschublade hat eine andere Farbe, daher habe ich jedes getönte Symbol und auch eine Auswahl für jedes Symbol erstellt. Und ich benutze diesen Selektor für mein Symbol. <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@drawable/ic_home_tinted" /> <item android:drawable="@drawable/ic_home" /> </selector>
Auswahl

@Orochi Schauen Sie sich meine Antwort an, da sie direkt aus Googles Blogs stammt. Es funktioniert hauptsächlich nur mit Android 5.0+, kann aber auch mit einigen Widgets für Geräte vor Android 5.0 funktionieren.
Jared Burrows

@Orochi Sie müssen benutzerdefinierte Ansichten erstellen, um den gleichen Effekt zu "emulieren".
Jared Burrows

1
Sie können eine Bildansicht verwenden, das Symbol so weiß wie möglich gestalten und mit iv.setColorFilter (yourColor, Mode.Multiply) eine beliebige Farbe festlegen. Stellen Sie sicher, dass Sie android.graphics.PorterDuff.Mode
jb15613

3
Selbes Problem hier. Leider funktioniert der Farbton mit Selektor nicht mit API <21
Luccas

17

Eine ähnliche Frage wurde bereits hier gestellt: https://stackoverflow.com/a/26533340/950427

Android Drawable Tinting wird nur in Android 5.0+ (API 21+) unterstützt. (Es heißt " At the moment this is limited to coloring the action bar and some widgets.").

Theming

...

Wenn Sie diese Attribute festlegen, gibt AppCompat ihre Werte automatisch an die Framework-Attribute auf API 21+ weiter.Dadurch werden die Statusleiste und der Aufgabeneintrag Übersicht (Letzte) automatisch eingefärbt.

Auf älteren Plattformen emuliert AppCompat nach Möglichkeit das Farbthema. Im Moment beschränkt sich dies auf das Färben der Aktionsleiste und einiger Widgets.

Und

Widget-Tönung

Bei der Ausführung auf Geräten mit Android 5.0 werden alle Widgets mithilfe der Farbthema-Attribute getönt, über die wir gerade gesprochen haben. Es gibt zwei Hauptfunktionen, die dies auf Lollipop ermöglichen: das Zeichnen von Zeichen und das Verweisen auf Themenattribute (der Form? Attr / foo) in Zeichen.

AppCompat bietet in früheren Android-Versionen ein ähnliches Verhalten für eine Teilmenge der UI-Widgets:

Alles, was von der AppCompat-Symbolleiste bereitgestellt wird (Aktionsmodi usw.) EditText Spinner CheckBox RadioButton-Schalter (verwenden Sie den neuen android.support.v7.widget.SwitchCompat) CheckedTextView Sie müssen nichts Besonderes tun, damit diese funktionieren Ihre Layouts wie gewohnt und AppCompat erledigt den Rest (mit einigen Einschränkungen; siehe die FAQ unten).

Quellen:

http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

https://chris.banes.me/2014/10/17/appcompat-v21/


Warum wurde das abgelehnt? Dies ist aus der offiziellen Dokumentation.
Jared Burrows

Die Antwort ist veraltet. ImageViewunterstützt jetzt auch android:tintüber AppCompat, wie in @ Joniks Antwort.
Vicky Chijwani

@ VickyChijwani Senden Sie eine Bearbeitung. Und du meinst AppCompatImageViewnicht ImageView.
Jared Burrows


6

Zum Abtönen von Bildern können Sie verwenden imageView.setColorFilter(int color). Dies funktioniert ab API 8 und dient dazu, mein schwarzes Bild auf eine gewünschte Farbe zu tönen. Dies kann ersetzen, setImageTintList()aber nur die Verwendung android:tintsollte auch funktionieren.


4

Verwenden Sie diesen NameSpace xmlns
: app = "http://schemas.android.com/apk/res-auto"

und nachdem Sie jeden android: tint durch app: tint ersetzen können. Dies behebt das Problem für mich.


4

Ich bin etwas spät dran, aber hier ist, wie es geht.

val textInput = EditText(context)

val drawable = ContextCompat.getDrawable(context, R.drawable.your_drawable)
drawable?.let {
    myDrawable -> DrawableCompat.setTint(myDrawable, ContextCompat.getColor(context, R.color.your_color))
    textInput.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, myDrawable, null)
}

1

Dies funktioniert wie Sie möchten und sollte auf allen Android-Versionen der Support-Bibliothek funktionieren:

@JvmStatic
fun getTintedDrawable(inputDrawable: Drawable, @ColorInt color: Int): Drawable {
    val wrapDrawable = DrawableCompat.wrap(inputDrawable.mutate())
    DrawableCompat.setTint(wrapDrawable, color)
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN)
    return wrapDrawable
}

1

Wenn jemand ein neues Zeichenobjekt erstellen möchte (tin1, tint2 ..), versuchen Sie dies

<?xml version="1.0" encoding="utf-8"?>
<bitmap
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/your_image"
  android:tint="@color/tint_color">
   </bitmap>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.