Android 按钮可绘制色调

Posted

技术标签:

【中文标题】Android 按钮可绘制色调【英文标题】:Android Button Drawable Tint 【发布时间】:2015-09-05 11:09:30 【问题描述】:

是否可以在 android 按钮中为 drawableLeft 着色?我有一个黑色的drawable,我想染成白色。我知道如何使用图像视图(左侧图像)来实现这一点,但我想使用默认的 android 按钮来实现这一点。

我的源代码:

<Button android:layout_
        android:layout_
        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"
        />

有没有办法给按钮上色?或者有没有自定义的view方法来实现这个效果?

【问题讨论】:

所以你想在按钮文本的左边放置一张图片? @HawraaKhalil 是的,完全正确。但它应该是白色的 如果您希望 drawableTint 进入支持库,请在此处投票 code.google.com/p/android/issues/detail?id=198613 【参考方案1】:

你可以用这个方法实现按钮上的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 控件,如下所示

<Button
        android:layout_
        android:layout_
        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)。

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

第 2 步: 在主题下拉菜单下选择自定义

第 3 步: 然后在前景色选择中选择颜色为#FFFFFF。

最后完成向导以添加图像,然后将可绘制对象添加为图像。

【讨论】:

谢谢,我现在使用第一种方法,因为我还想在 ui 的其他部分使用(黑色)图标。 但请记住,仅从 Lollipop 开始支持 tint 属性。对于棒棒糖之前的支持,我使用以下代码以编程方式为可绘制按钮着色:Drawable[] drawables = postButton.getCompoundDrawables(); Drawable wrapDrawable = DrawableCompat.wrap(drawables[0]); DrawableCompat.setTint(wrapDrawable, getResources().getColor(android.R.color.white));,使用 support-v4 库。 似乎方法 1 仅适用于默认图标(来自 android)。如果我们在我们的资源上添加一个新图标,它对我来说不起作用。只是一个注释。 如果您想更改 TextView 的可绘制颜色,此方法(在我的情况下为方法 1)也适用。 这很好。我的应用的最低版本是 21,所以不必担心低于 21【参考方案2】:

正如@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】:

我可能迟到了,但如果你使用 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】:

我知道已经有很多答案了,但没有一个让我感到高兴,因为我不想为不同风格的元素使用不同的可绘制对象。

所以我的解决方案是像这样在构造函数中设置颜色过滤器:

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

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

【讨论】:

【参考方案5】:

您可以在>23 android 版本中使用android:drawableTint="@color/yourColor"

【讨论】:

23以下呢?? 为此你可以使用 app:drawableTint 奇怪,在 API 23 中对我不起作用。 @KishanSolanki,这里在 API 23 中不起作用【参考方案6】:

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

分级:

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

查看:

<com.google.android.material.button.MaterialButton
    android:layout_
    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"
    />

【讨论】:

【参考方案7】:

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

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

或在 XML 中,

android:drawableTint="@color/white"

【讨论】:

android:drawableTint 是这里的正确答案。谢谢!

以上是关于Android 按钮可绘制色调的主要内容,如果未能解决你的问题,请参考以下文章

Android imageview更改色调以模拟按钮单击

如何在 Android 的浮动操作按钮 FAB 中保留可绘制的默认颜色

Android TV 按钮不显示焦点可绘制对象

更改按钮内的可绘制大小

如何在Android中设置按钮内可绘制矢量的大小?

按钮上的透明色调