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.

MaTTo
quelle

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.

Sakiboy
quelle
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));
Simon K. Gerges
quelle
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"
    />
Jonik
quelle
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/

Jared Burrows
quelle
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
13

Jetzt ersetzt AppCompatImageView, AppCompatButton die Schaltfläche ImageView, um den Farbton auf Geräten mit niedrigerer API zu unterstützen. Überprüfen Sie den Link für weitere Details AppCompatImageView , AppCompatButton

Ankit Singh
quelle
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.

Peterdk
quelle
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.

seinta
quelle
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)
}
Verrückt
quelle
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
}
Android-Entwickler
quelle
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>
Ranjith Kumar
quelle