How can I set tint for an image view programmatically in Android?
Categories:
How to Programmatically Apply a Tint to an Android ImageView

Learn various methods to dynamically set and manage color tints for ImageView components in your Android applications, enhancing UI adaptability and visual feedback.
Tinting an ImageView
programmatically in Android is a common requirement for adapting UI elements to different themes, states, or user preferences. Instead of creating multiple drawable assets for each color variation, you can apply a color filter or tint mode directly to your existing drawables. This article explores several robust methods to achieve this, focusing on modern Android development practices.
Understanding ImageView Tinting
Tinting an ImageView
involves applying a color overlay to its drawable content. This is particularly useful for icons, buttons, or other graphical elements that need to change color without altering the underlying image asset. Android provides several ways to achieve this, primarily through setColorFilter()
and setImageTintList()
.
flowchart TD A[Start] --> B{Need to tint ImageView?} B -->|Yes| C{Android Version?} C -->|API 21+| D[Use setImageTintList()] C -->|API < 21| E[Use setColorFilter()] D --> F[Apply ColorStateList] E --> G[Apply PorterDuff.Mode] F --> H[End] G --> H[End] B -->|No| H[End]
Decision flow for choosing ImageView tinting method
Method 1: Using setImageTintList()
(API 21+)
For Android API level 21 (Lollipop) and above, the preferred and most flexible method is to use setImageTintList()
. This method allows you to apply a ColorStateList
, which can define different tint colors based on the view's state (e.g., pressed, focused, enabled). This is ideal for interactive elements.
import android.graphics.Color
import android.content.res.ColorStateList
import android.widget.ImageView
import androidx.core.content.ContextCompat
// Assuming 'imageView' is your ImageView instance
// And 'context' is a valid Context (e.g., from an Activity or Fragment)
// Method 1a: Simple solid color tint
val solidColor = Color.parseColor("#FF0000") // Red color
imageView.imageTintList = ColorStateList.valueOf(solidColor)
// Method 1b: Tint from a ColorStateList XML resource
// res/color/my_tint_selector.xml:
// <selector xmlns:android="http://schemas.android.com/apk/res/android">
// <item android:state_pressed="true" android:color="#FF0000"/>
// <item android:state_focused="true" android:color="#00FF00"/>
// <item android:color="#0000FF"/>
// </selector>
val colorStateList = ContextCompat.getColorStateList(context, R.color.my_tint_selector)
imageView.imageTintList = colorStateList
Applying a tint using setImageTintList()
with a solid color or a ColorStateList
.
ColorStateList
from XML is highly recommended for complex tinting scenarios, as it centralizes color definitions and makes your UI more maintainable and adaptable to different states.Method 2: Using setColorFilter()
(All API Levels)
For compatibility with older Android versions (pre-API 21) or when you need a simple, single-color tint without state-based variations, setColorFilter()
is the go-to method. This method applies a ColorFilter
to the drawable, effectively blending the specified color with the image using a PorterDuff.Mode
.
import android.graphics.Color
import android.graphics.PorterDuff
import android.widget.ImageView
// Assuming 'imageView' is your ImageView instance
// Apply a red tint with SRC_IN mode
// SRC_IN: The tint color is drawn only where the image pixels are opaque.
// This is often the most visually appealing mode for tinting icons.
imageView.setColorFilter(Color.parseColor("#FF0000"), PorterDuff.Mode.SRC_IN)
// Other common PorterDuff.Mode options:
// PorterDuff.Mode.MULTIPLY: Multiplies the source and destination colors.
// PorterDuff.Mode.OVERLAY: Overlays the source and destination colors.
// PorterDuff.Mode.SRC_ATOP: Draws the source on top of the destination, using the destination's alpha.
// To clear the tint:
// imageView.clearColorFilter()
Applying a tint using setColorFilter()
with PorterDuff.Mode.SRC_IN
.
setColorFilter()
works on all API levels, it's generally less performant and flexible than setImageTintList()
for API 21+ devices, especially when dealing with state-aware tints. Use it primarily for backward compatibility or simple, static tints.Choosing the Right PorterDuff.Mode
When using setColorFilter()
, the PorterDuff.Mode
parameter is crucial as it defines how the tint color interacts with the original image pixels. The most common and often desired mode for simple tinting is SRC_IN
. However, understanding other modes can help achieve different visual effects.

Visual representation of how various PorterDuff.Mode
options affect image tinting.
Clearing the Tint
To remove any applied tint from an ImageView
, you can use the following methods depending on how the tint was applied.
import android.widget.ImageView
import android.content.res.ColorStateList
// Assuming 'imageView' is your ImageView instance
// If tint was applied with setImageTintList()
// For API 21+:
imageView.imageTintList = null
// If tint was applied with setColorFilter()
// For all API levels:
imageView.clearColorFilter()
Methods to clear an applied tint from an ImageView.
clearColorFilter()
will remove any ColorFilter
, regardless of whether it was set via setColorFilter()
or implicitly by setImageTintList()
on older APIs (though setImageTintList(null)
is cleaner for API 21+).