Colorazione disegnabile per api <21


84

È possibile far funzionare la colorazione disegnabile per api <21?

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

Funziona bene ma solo per dispositivi con API21. Qualche soluzione alternativa per dispositivi api inferiori o supporto AppCompat? Non riesco a trovare niente.

Risposte:


106

Usa AppCompatImageViewcosì:

<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"
    />

Assicurati di avere le ultime novità appcompat-v7nella tua app build.gradle.

Esempio: compile 'com.android.support:appcompat-v7:25.0.0'nel file build.gradle.


66
Dai AppCompatImageViewdocumenti: 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/… Quindi, l'utilizzo del normale ImageViewnel layout dovrebbe funzionare bene.
Nimrod Dayan

1
Come menzionato sopra da @NimrodDayan, questo non dovrebbe essere necessario. Tuttavia, ricevo segnalazioni di Android: tint non funziona su un Samsung A5 e Moto G (utilizzando appcompat-v7: 23.4.0), quindi è possibile che le ImageView non vengano sostituite correttamente su alcuni dispositivi.
Stephen Kidson

@StephenKidson, sto usando la stessa versione di appcompat e ho riscontrato lo stesso problema anche su un dispositivo di marca sconosciuta. Sei riuscito a risolverlo? Mi chiedo se sia stato segnalato un bug su questo ...
Nimrod Dayan

4
Questo non ha funzionato sull'emulatore Android 4.0 utilizzando appcompat-v7: 25.1.0.
Peterdk

4
AppCompatImageView non può essere utilizzato all'interno di un widget. Usa setColorFilter su ImageView.
Massimo

46

Puoi ottenerlo utilizzando il codice sorgente. In precedenza la colorazione non era supportata da DrawableCompat. A partire dalla libreria di supporto 22.1 puoi farlo, ma devi farlo in questo modo:

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

18
Se hai bisogno di supportare la colorazione su <21 API, probabilmente vorrai usare al ContextCompat.getColor()posto di getResources().getColor().
Sevastyan Savanyuk

22

Non potresti semplicemente usare un ImageView per visualizzare il tuo Drawable? android:tintfunziona bene sui livelli API precedenti.

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

2
Sto usando ImageView - per visualizzare l'icona in esso. Queste icone fanno parte degli elementi nel mio cassetto di navigazione. E l'elemento selezionato nel cassetto di navigazione ha un colore diverso, quindi ho creato ogni icona colorata e anche il selettore per ogni icona. E sto usando quel selettore per la mia icona. Selettore:<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>
MaTTo

@Orochi Dai un'occhiata alla mia risposta in quanto proviene direttamente dai blog di Google. Funziona principalmente solo su Android 5.0 e versioni successive, ma potrebbe funzionare su alcuni widget per dispositivi con versioni precedenti ad Android 5.0.
Jared Burrows

@Orochi Dovrai creare visualizzazioni personalizzate per "emulare" lo stesso effetto.
Jared Burrows

1
È possibile utilizzare una visualizzazione immagine, rendere l'icona il più bianca possibile e renderla del colore desiderato con iv.setColorFilter (yourColor, Mode.Multiply); Assicurati di importare android.graphics.PorterDuff.Mode
jb15613

3
Stesso problema qui. Purtroppo la tinta con selettore non funziona con api <21
Luccas

17

Una domanda simile è stata posta prima qui: https://stackoverflow.com/a/26533340/950427

Android Drawable Tinting è supportato solo in Android 5.0+ (API 21+). (Dice " At the moment this is limited to coloring the action bar and some widgets.").

Theming

...

Quando imposti questi attributi, AppCompat propaga automaticamente i loro valori agli attributi del framework su API 21+. Questo colora automaticamente la barra di stato e la voce attività Panoramica (Recenti).

Sulle piattaforme più vecchie, AppCompat emula il tema del colore ove possibile. Al momento questo si limita a colorare la barra delle azioni e alcuni widget.

E

Colorazione widget

Quando si esegue su dispositivi con Android 5.0, tutti i widget sono colorati utilizzando gli attributi del tema del colore di cui abbiamo appena parlato.Ci sono due caratteristiche principali che lo consentono su Lollipop: la colorazione drawable e il riferimento agli attributi del tema (della forma? Attr / foo) nei drawables.

AppCompat fornisce un comportamento simile nelle versioni precedenti di Android per un sottoinsieme di widget dell'interfaccia utente:

Tutto fornito dalla barra degli strumenti di AppCompat (modalità di azione, ecc.) EditText Spinner CheckBox RadioButton Switch (usa il nuovo android.support.v7.widget.SwitchCompat) CheckedTextView Non devi fare nulla di speciale per farli funzionare, usa semplicemente questi controlli in i tuoi layout come al solito e AppCompat farà il resto (con alcuni avvertimenti; vedi le FAQ di seguito).

Fonti:

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

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


Perché questo è stato downvoted? Questo è dalla documentazione ufficiale.
Jared Burrows

La risposta è obsoleta. ImageViewora supporta anche android:tinttramite AppCompat, come nella risposta di @ Jonik.
Vicky Chijwani

@VickyChijwani Invia una modifica. E vuoi dire AppCompatImageView, no ImageView.
Jared Burrows


6

Per colorare le immagini potresti usare imageView.setColorFilter(int color). Funziona dall'API 8 e ha funzionato per colorare la mia immagine nera con un colore che volevo. Questo può sostituire, setImageTintList()ma android:tintdovrebbe funzionare anche il solo utilizzo .


6

Usa questo NameSpace
xmlns: app = "http://schemas.android.com/apk/res-auto"

e dopo puoi sostituire ogni android: tint con app: tint. Questo risolve il problema per me.


4

Sono un po 'in ritardo ma ecco come farlo.

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

Questo farà come vuoi e dovrebbe funzionare su tutte le versioni Android della libreria di supporto:

@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

Se qualcuno vuole creare un nuovo disegnabile (tin1, tint2 ..) prova questo

<?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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.