Android Button Drawable Tint

前端 未结 7 1493
自闭症患者
自闭症患者 2020-12-04 18:13

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

相关标签:
7条回答
  • 2020-12-04 18:17

    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. Method 2 Pictorial representation

    Finally finish the wizard to add the image, then add the drawable as an image.

    Pictorial representation for answer to the question

    0 讨论(0)
  • 2020-12-04 18:20

    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});
    }
    
    0 讨论(0)
  • 2020-12-04 18:31

    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.

    0 讨论(0)
  • 2020-12-04 18:32

    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"
        />
    
    0 讨论(0)
  • 2020-12-04 18:38

    You can use android:drawableTint="@color/yourColor" in >23 android version.

    0 讨论(0)
  • 2020-12-04 18:40

    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.

    0 讨论(0)
提交回复
热议问题