È 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 ...
È 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 ...
Risposte:
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.
android:tint
funziona su tutte le versioni di Android. Forse stai parlando drawableTint
?
La maggior parte delle risposte si riferisce all'uso setColorFilter
che 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 yourTint
in 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);
ImageView
istanze xml con tema AppCompat o su AppCompatImageView
sottoclassi.
Questo ha funzionato per me
mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik ha ragione. L'altro errore nel codice è quando si fa riferimento al colore definito in XML. È stato passato solo l'id al setColorFilter
metodo, quando è necessario utilizzare l'ID per individuare la risorsa colore e passare la risorsa al setColorFilter
metodo. 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 setColorFilter
troppo il metodo ...)
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
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)
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 .
imageView.getBackground()
per ottenere il disegno, perché imageView.getDrawable()
stava tornando null.
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);
img
è di tipo ImageView.
Semplice e una riga
imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
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 :-)
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 ImageView
disegno 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);
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);
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 :-)
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!
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>
app:srcCompat
invece di android:src
e aggiungere vectorDrawables.useSupportLibrary = true
nella defaultConfig
parte del file build.gradle. Testato per funzionare correttamente sull'emulatore Kitkat.
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));
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.
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 /drawable
cartella 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)
Nel caso in cui desideri impostare il selettore sulla tua tinta:
ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));
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))
}
Risposta non esatta ma un'alternativa più semplice:
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>
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.