Android Button Drawable Tint

vig*_*ion 31 android drawable uicolor android-layout

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

在此输入图像描述

我的源代码:

<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"
        />
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*b K 59

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

步骤1:创建一个可绘制的资源文件,其中位图作为父元素,如下所示,并将其命名为ic_action_landscape.xmldrawable文件夹下

<?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" />
Run Code Online (Sandbox Code Playgroud)

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

<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" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

步骤3:
然后在前景颜色选择中选择颜色为#FFFFFF. 方法2图示

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

回答问题的图示表示

  • 但请记住,仅在Lollipop之后才支持tint属性.对于前Lollipop支持,我使用以下代码以编程方式为可绘制按钮着色:`Drawable [] drawables = postButton.getCompoundDrawables(); Drawable wrapDrawable = DrawableCompat.wrap(drawables [0]); DrawableCompat.setTint(wrapDrawable,getResources().getColor(android.R.color.white));`,使用support-v4库. (17认同)
  • 看来方法1仅适用于默认图标(来自android)。如果我们在资源上添加一个新图标,那么它就无法正常工作。请注意。 (2认同)

Azi*_*ziz 14

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

textView.compoundDrawableTintList = ColorStateList.valueOf(Color.WHITE)
Run Code Online (Sandbox Code Playgroud)

或者在 XML 中,

android:drawableTint="@color/white"
Run Code Online (Sandbox Code Playgroud)


Edg*_*arK 7

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

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*lfe 6

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

摇篮:

implementation "com.google.android.material:material:1.1.0-alpha09"
Run Code Online (Sandbox Code Playgroud)

看法:

<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"
    />
Run Code Online (Sandbox Code Playgroud)