Android Button Drawable Tint

时间:2015-06-19 12:51:00

标签: android android-layout drawable uicolor

是否可以在Android按钮中着色drawableLeft?我有一个黑色的画笔,我想要着色白色。我知道如何用图像视图(左边的图像)实现这一点,但我想用默认的android按钮来做到这一点。

enter image description here

我的源代码:

<Button android:layout_height="wrap_content"
        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"
        android:drawableLeft="@drawable/ic_action_landscape"
        android:gravity="left|center_vertical"
        android:drawablePadding="8dp"
        />

有没有办法给按钮着色?或者是否有自定义视图方法来实现此效果?

7 个答案:

答案 0 :(得分:53)

您可以使用以下方法在按钮上对drawableleft进行着色:

第1步: 使用位图作为父元素创建一个可绘制的资源文件,如下所示并命名 在drawable文件夹下的ic_action_landscape.xml

<?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" />

第2步: 在布局中创建按钮控件,如下所示

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

该按钮从drawable文件夹中获取ic_action_landscape.xml的drawable,而不是@android:drawable或drawable png(s)。

方法2:
第1步:
您甚至可以将图标添加为操作栏和选项卡图标,前景为图像 可以从自定义位置或剪贴画导入

步骤2:
在主题下拉列表下,选择自定义

步骤3:
然后在前景颜色选择中选择颜色为#FFFFFF。 Method 2 Pictorial representation

最后完成向导添加图像,然后将drawable添加为图像。

Pictorial representation for answer to the question

答案 1 :(得分:2)

我知道已经有很多答案,但是由于我不想为不同风格的元素提供不同的绘图,所以没有它们让我开心。

所以我的解决方案是在构造函数中设置颜色过滤器,如下所示:

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

我使用的是文字颜色,因为这是我需要的,但它可以用自定义属性替换为更加动态。

答案 2 :(得分:1)

正如@Boris建议的那样,您可以使用支持库。

我已经使用一些draft code扩展了AppCompatButton。 TintAppCompatButton应具有默认行为,但 TintAppCompatButtonCustom用于演示自定义着色。

我会看看我是否可以提高PR以将其纳入官方支持库。

感兴趣的代码是:

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

答案 3 :(得分:0)

我可能会迟到,但是如果你使用C#,你可以这样做:

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

您还需要:

using Android.Graphics;
using static Android.Graphics.PorterDuff;
using Android.Graphics.Drawables;

希望这会有所帮助。这是我找到的最简单的方法。 另请注意,您使用此图标的应用中的任何位置都是此颜色。

答案 4 :(得分:0)

您可以在超过23个Android版本中使用android:drawableTint="@color/yourColor"

答案 5 :(得分:0)

我可以使用MaterialButton(来自材料支持库,大多数人可能已经在使用)来完成相同的操作。 MaterialButton有一个名为icon的属性,可以将其放在左/中/右(默认为左)。它还具有一个名为iconTint的属性,它将为图标着色。

等级:

implementation "com.google.android.material:material:1.1.0-alpha09"

查看:

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

答案 6 :(得分:0)

您可以使用可绘制过滤器,或者如果您的API> = M,则可以简单地

textView.compoundDrawableTintList = ColorStateList.valueOf(Color.WHITE)

或XML,

android:drawableTint="@color/white"