是否可以在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"
/>
有没有办法给按钮着色?或者是否有自定义视图方法来实现此效果?
答案 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。
最后完成向导添加图像,然后将drawable添加为图像。
答案 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"