Androidbutton可绘制色调

是否有可能在androidbutton中绘制drawableLeft? 我有一个黑色的drawable,我想要着色成白色。 我知道如何实现与图像视图(左图),但我想用默认的安卓button来做到这一点。

在这里输入图像说明

我的源代码:

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

有没有什么办法给button着色? 还是有一个自定义视图方法来实现这个效果?

Solutions Collecting From Web of "Androidbutton可绘制色调"

您可以使用此方法在button上为drawableleft着色:

步骤1:创build一个带有位图的可绘制资源文件作为父元素,如下所示,并在可绘制文件夹下将其命名为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步:在您的布局中创build您的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" /> 

该button从可绘制文件夹(而不是@android:drawable或drawable png(s))从ic_action_landscape.xml获取drawable。

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

第2步:
在主题下拉菜单中select自定义

第3步:
然后在前景颜色select中select颜色为#FFFFFF。 方法2图示

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

图解表示回答这个问题

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

我用一些草稿代码扩展了AppCompatButton。 TintAppCompatButton应该具有默认行为, 但是 TintAppCompatButtonCustom被用来演示自定义着色。

我会看看我是否可以通过公关把它变成官方的支持库。

感兴趣的代码是:

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

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

希望这可以帮助。 这是我find的最简单的方法。 请注意,在您的应用程序中,您正在使用此图标的任何地方,都会是这种颜色。

我知道已经有很多答案了,但是没有一个让我开心,因为我不想为不同的元素绘制不同的drawable。

所以我的解决scheme是像这样在构造函数中设置颜色filter:

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

我用文字颜色,因为这是我所需要的,但它可以被replace为自定义属性更加dynamic。