Come impostare la tinta per una visualizzazione di immagine a livello di codice in Android?


397

È necessario impostare la tinta per una vista immagine ... La sto usando nel modo seguente:

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);

Ma non cambia ...


15
Potresti aver usato l'id della risorsa intera anziché il valore del colore intero, prova a convertire R.color.blue in getResources (). GetColor (R.color.blue)
milosmns,

Drawable drawable = ...; drawable.setColorFilter (ContextCompat.getColor (context, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (drawable); // qui può essere usato qualsiasi colore
flame3,

Risposte:


916

Puoi cambiare la tinta, abbastanza facilmente nel codice tramite:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Tinta bianca

Se vuoi la tinta del colore, allora

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);

Per il disegno vettoriale

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);

AGGIORNAMENTO :
@ADev ha una soluzione più recente nella sua risposta qui , ma la sua soluzione richiede una libreria di supporto più recente - 25.4.0 o successiva.



12
In XML, android: tint = "@ color / blue"
Luis

1
Plus android: tint is 21+
androidguy

8
android:tintfunziona su tutte le versioni di Android. Forse stai parlando drawableTint?
Finstas,

11
PorterDuff.Mode.MULTIPLY non funziona nella mia situazione, ho usato PorterDuff.Mode.SRC_IN e funziona
Mohamed Nageh,

235

La maggior parte delle risposte si riferisce all'uso setColorFilterche non è quello che è stato inizialmente richiesto.

L'utente @Tad ha la sua risposta nella giusta direzione ma funziona solo su API 21+.

Per impostare la tinta su tutte le versioni di Android, utilizzare ImageViewCompat:

ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));

Si noti che yourTintin questo caso deve essere un "color int". Se hai una risorsa colore come R.color.blue, devi prima caricare il colore int:

ContextCompat.getColor(context, R.color.blue);

6
Dovrebbe essere la risposta accettata. Nota che funziona solo su ImageViewistanze xml con tema AppCompat o su AppCompatImageViewsottoclassi.
Louis CAD,

1
@ADev apprezza la tua soluzione, ma la domanda è stata posta nel 2013 e ImageViewCompat e AppCompatImageView sono stati rilasciati con il supporto v4 lib 25.4.0 a giugno 2017 e 25.1.0 dicembre 2016 rispettivamente :)
Hardik,

1
@ADev ovviamente, ma non hai menzionato correttamente nella tua risposta che la tua soluzione è nuova e richiede una libreria di supporto più recente 25.4.0 e successive perché con una versione inferiore di lib di supporto questa classe non è disponibile quindi nessuno potrebbe trovarla !! !! tra l'altro ho modificato la risposta :) buona giornata ...
Hardik

Questo non funziona su API 16.
Tayyab Mazhar

49

Questo ha funzionato per me

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

sì, ha funzionato anche per me, senza il secondo parametro .. può anche andaremImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad,

votato e senza il secondo parametro, funziona come un incantesimo. Thx @ toobsco42
Ravi Vaniya,

35

@Hardik ha ragione. L'altro errore nel codice è quando si fa riferimento al colore definito in XML. È stato passato solo l'id al setColorFiltermetodo, quando è necessario utilizzare l'ID per individuare la risorsa colore e passare la risorsa al setColorFiltermetodo. Riscrivere il codice originale di seguito.

Se questa linea rientra nella tua attività:

imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Altrimenti, devi fare riferimento alla tua attività principale:

Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Si noti che ciò vale anche per gli altri tipi di risorse, come numeri interi, valori booleari, dimensioni, ecc. Tranne la stringa, per la quale è possibile utilizzare direttamente getString()nella propria attività senza dover prima chiamare getResources()(non chiedermi perché) .

Altrimenti, il tuo codice sembra buono. (Anche se non ho studiato setColorFiltertroppo il metodo ...)


22

Dopo aver provato tutti i metodi e non hanno funzionato per me.

Ottengo la soluzione utilizzando un altro PortDuff.MODE.

imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);

14

A partire da Lollipop, esiste anche un metodo tint per BitmapDrawables che funziona con la nuova classe Tavolozza:

public void setTintList (ColorStateList tint)

e

void pubblico setTintMode (PorterDuff.Mode tintMode)

Nelle versioni precedenti di Android, ora puoi utilizzare la libreria DrawableCompat


2
in realtà, la libreria di supporto non la supporta. vedi la mia risposta: stackoverflow.com/a/34479043/878126
sviluppatore Android il

13

Migliore funzione di estensione semplificata grazie ad ADev

fun ImageView.setTint(@ColorRes colorRes: Int) {
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

Uso: -

imageView.setTint(R.color.tintColor)

Ce n'è uno simile per il colore del pulsante Button / TextView?
Sviluppatore Android

intendi il colore o la tinta del testo della visualizzazione del testo per il disegno della visualizzazione del testo?
Manohar Reddy,

Intendo "tinta del testo". Il colore del testo. Ma penso che sia abbastanza problematico, dato che il testo ha un colore per ogni stato ... Quindi, come mai funziona bene quando imposto il colore dell'accento ... Strano .... È possibile forse impostare il colore dell'accento su un pulsante specifico (o TextView), a livello di codice?
sviluppatore Android

12

Prova questo. Dovrebbe funzionare su tutte le versioni di Android supportate dalla libreria di supporto:

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;
}

È possibile utilizzare uno dei precedenti per farlo funzionare.

Puoi leggere le caratteristiche più interessanti di DrawableCompat sui documenti, qui .


1
Ho anche dovuto fare imageView.getBackground()per ottenere il disegno, perché imageView.getDrawable()stava tornando null.
Rock Lee,

@RockLee assicurati di aver usato src nella vista immagine xml o setImageResource nel codice
orelzion

questo è il modo perfetto per impostare il colore della tinta per lo sfondo di
imageview

11

Se il tuo colore ha una trasparenza esadecimale, usa il codice seguente.

ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));

Per cancellare la tinta

ImageViewCompat.setImageTintList(imageView, null);

qual è il tipo di "img"
Beyaz,

1
@Beyaz imgè di tipo ImageView.
Sai,

10

Semplice e una riga

imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));

9

Poiché la prima risposta non ha funzionato per me:

//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)));

Questo sembra funzionare solo in API 21+, ma per me non è stato un problema. È possibile utilizzare un ImageViewCompat per risolvere il problema, comunque.

Spero di aver aiutato qualcuno :-)


7

A partire da Lollipop, esiste un metodo chiamato ImageView#setImageTintList()che puoi usare ... il vantaggio è che ci vuole unColorStateList in contrapposizione a un solo colore, rendendo così consapevole la tinta dell'immagine.

Sui dispositivi pre-Lollipop, puoi ottenere lo stesso comportamento colorando il disegno e quindi impostandolo come ImageViewdisegno dell'immagine:

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);

6
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);

6

Per impostare la tinta per una visualizzazione dell'immagine programmaticamente in Android

Ho due metodi per Android:

1)

imgView.setColorFilter(context.getResources().getColor(R.color.blue));

2)

 DrawableCompat.setTint(imgView.getDrawable(),
                     ContextCompat.getColor(context, R.color.blue));

Spero di aver aiutato qualcuno :-)


4

Aggiungendo al ADEV 's risposta (che a mio parere è la più corretta), dal momento che l'adozione diffusa di Kotlin, e le sue funzioni di estensione utili:

fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
    val color = ContextCompat.getColor(context, colorId)
    val colorStateList = ColorStateList.valueOf(color)
    ImageViewCompat.setImageTintList(this, colorStateList)
}

Penso che questa sia una funzione che potrebbe essere utile avere in qualsiasi progetto Android!


4

Ho scoperto che possiamo usare il selettore di colori per la tinta attr:

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>

Ciao, non funziona con i disegni vettoriali ... Qualche soluzione alternativa per lo stesso?
Manukumar,

@Manukumar Utilizzare app:srcCompatinvece di android:srce aggiungere vectorDrawables.useSupportLibrary = truenella defaultConfigparte del file build.gradle. Testato per funzionare correttamente sull'emulatore Kitkat.
sviluppatore Android

3

Non usare PoterDuff.Mode, usa setColorFilter()funziona per tutti.

ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));

2

Come ha detto @milosmns, dovresti usare imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

Questa API necessita del valore del colore anziché dell'ID della risorsa colore, questa è la causa principale per cui la tua dichiarazione non ha funzionato.


2

Sono in ritardo alla festa ma non ho visto la mia solitudine sopra. Siamo in grado di impostare anche il colore della tinta setImageResource()(la mia minSdkVersion è 24).

Quindi, prima, devi creare un selettore e salvarlo nella /drawablecartella delle risorse (lo chiamo 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"/>

Quindi impostalo in un codice come questo:

val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)

2

Nel caso in cui desideri impostare il selettore sulla tua tinta:

ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));

0

Soluzione di Kotlin che utilizza la funzione di estensione, per impostare e annullare la colorazione:

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))
}

-4

Risposta non esatta ma un'alternativa più semplice:

  • Posiziona un'altra vista sopra l'immagine
  • Modificare il valore alfa della vista come desiderato (programmaticamente) per ottenere l'effetto desiderato.

Ecco un frammento per questo:

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

si tratta di tinta! non alfa per trasparenza.
David,

Ma questo finisce per agire come una tinta. Dovresti provarlo tu stesso. Questo è solo un modo per guardare le cose.
Shubham Chaudhary,

@ShubhamChaudhary So che è tardi, ma se l'immagine fosse png. Quindi lo sfondo non cambierà? Anche Alpha e tint sono molto diversi. La tinta è come la sostituzione del colore, se non sbaglio. Nessuna infrazione prevista.
Sto

Punto valido. Questa risposta mi ha aiutato nel mio caso. La speranza si adatta anche alle scarpe di qualcun altro.
Shubham Chaudhary,
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.