Is it possible to tint the drawableLeft in an android button? I have a black drawable I\'d like to tint white. I know how to achieve this with an image view (image on the le
You can achieve coloring the drawableleft on a button with this method:
Step 1:
Create a drawable resource file with bitmap as parent element as shown below and name it
as ic_action_landscape.xml
under the drawable folder
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@android:drawable/ic_btn_speak_now"
android:tint="@color/white" />
Step 2: Create your Button control in your layout as below
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@color/md_light_green_500"
android:drawableLeft="@drawable/ic_action_landscape"
android:drawablePadding="8dp"
android:fontFamily="sans-serif"
android:gravity="left|center_vertical"
android:stateListAnimator="@null"
android:text="@string/drawer_quizzes"
android:textColor="#fff"
android:textSize="12dp" />
The button gets the drawable from the ic_action_landscape.xml
from the drawable folder instead of @android:drawable or drawable png(s).
Method 2:
Step 1:
You can even add the icon as a Action Bar and Tab icons with Foreground as Image
that can be imported from a custom location or a Clipart
Step 2:
Under Theme dropdown select Custom
Step 3:
Then select the color as #FFFFFF in the Foreground color selection.
Finally finish the wizard to add the image, then add the drawable as an image.
As @Boris suggested, you can use the support library.
I have extended the AppCompatButton with some draft code. The TintAppCompatButton should have default behaviour but TintAppCompatButtonCustom was made to demo custom coloring.
I’ll see if I can raise a PR to get that into the official support library.
The code of interest is:
private void init() {
PorterDuff.Mode tintMode = PorterDuff.Mode.SRC_IN;
Drawable[] ds = getCompoundDrawables();
tint(ds[LEFT], Color.RED, tintMode);
tint(ds[TOP], Color.YELLOW, tintMode);
tint(ds[RIGHT], Color.GREEN, tintMode);
tint(ds[BOTTOM], Color.BLUE, tintMode);
}
private void tint(Drawable d, int color, PorterDuff.Mode tintMode) {
TintInfo ti = new TintInfo();
ti.mTintMode = tintMode;
ti.mTintList = ColorStateList.valueOf(color);
ti.mHasTintList = true;
ti.mHasTintMode = true;
TintManager.tintDrawable(d, ti, new int[]{0});
}
I know there are lots of answers already, but non of them made me happy since I didn't want to have different drawables for different styles of elements.
So my solution was to set color filter in constructor like this:
int textColor = getTextColors().getColorForState(EMPTY_STATE_SET, Color.WHITE);
Drawable[] drawables = getCompoundDrawablesRelative();
for (Drawable drawable : drawables) {
if(drawable != null) {
drawable.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP);
}
}
I used text color because this was what I need, but it can be replaced with custom attribute to be more dinamic.
I was able to accomplish this same exact thing using a MaterialButton (from the material support library, which most people are probably using already). MaterialButton has an attribute named icon which can be placed left/center/right (default left). It also has an attribute called iconTint which will tint the icon.
Gradle:
implementation "com.google.android.material:material:1.1.0-alpha09"
View:
<com.google.android.material.button.MaterialButton
android:layout_width="0dp"
android:layout_weight="1"
android:text="@string/drawer_quizzes"
android:backgroundTint="@color/md_light_green_500"
android:stateListAnimator="@null"
android:textColor="#fff"
android:textSize="12dp"
android:fontFamily="sans-serif"
app:icon="@drawable/ic_action_landscape"
app:iconTint="@color/white"
android:gravity="left|center_vertical"
android:drawablePadding="8dp"
/>
You can use android:drawableTint="@color/yourColor"
in >23 android version.
I may be late on this but if you're using C#, you can do it this way:
Color iconColor = Color.Orange; // TODO: Get from settings
Mode mode = Mode.SrcAtop;
Drawable drawable = ResourcesCompat.GetDrawable(Resources, Resource.Drawable.ic_action_arrest, null);
drawable.SetColorFilter(iconColor, mode);
You'll also need:
using Android.Graphics;
using static Android.Graphics.PorterDuff;
using Android.Graphics.Drawables;
Hope this helps. It's the easiest way I found. Note, too, that ANY place in your app that you are using this icon, it will be this color.