如何在 android 中以编程方式更改 api 级别 23 以下按钮的可绘制色调
How to change drawable tint of a button below api level 23 programmatically in android
我想知道如何以编程方式更改按钮 drawableLeft/drawableRight 的颜色。我在我的 xml 中使用了可绘制的色调,如下所述,它可以工作 > api 级别 23 但无法更改颜色 < api 级别 23
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="VIEW ALL"
android:layout_centerInParent="true"
android:background="#00000000"
android:drawableLeft="@mipmap/ic_menu_black_36dp"
android:layout_centerVertical="true"
android:id="@+id/view_all"
android:textColor="@color/bottom_color"
android:drawableTint="@color/bottom_color"
/>
Button prev = (Button) findViewById(R.id.prev);
Drawable[] drawables =prev.getCompoundDrawables();
drawables[0].setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
prev.setCompoundDrawables(drawables[0],null,null,null);
解决方案:
Drawable[] drawablesprev =prev.getCompoundDrawables();
//for drawableleft drawable array index 0
drawablesprev[0].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);
//for drawableright drawable array index 2
drawablesprev[2].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);
//for drawabletop drawable array index 1
drawablesprev[1].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);
您正在使用 PorterDuff.Mode.MULTIPLY
,因此您在乘以颜色。假设(可绘制对象的名称)你的图标是黑色的 - #000000
或者 int
它将是 0
。然后 0 * GRAY
(或任何其他颜色)将始终为您提供 0
,所以仍然是黑色...
尝试其他 PorterDuff.Mode
,例如PorterDuff.Mode.SRC_ATOP
或 PorterDuff.Mode.SRC_IN
您当前的代码可能会使用白色版本的图标,应该使用 MULTIPLY
正确着色
这是一种为 TextView 或 Button 可绘制对象着色的快速方法:
private void tintViewDrawable(TextView view) {
Drawable[] drawables = view.getCompoundDrawables();
for (Drawable drawable : drawables) {
if (drawable != null) {
drawable.setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_ATOP);
}
}
}
对于 kotlin,这对我有用
your_view.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP)
或者如果您使用资源
your_view.setColorFilter(ContextCompat.getColor(this.baseContext, R.color.colorPrimary), PorterDuff.Mode.SRC_ATOP)
_BTNCancel.getBackground().setAlpha(128);
它将使按钮或任何视图变为 50% 色调
如果您更喜欢使用 XML 代码而不是 JAVA 您可以更改 android:drawableTint
属性到app:drawableTint
.
我想知道如何以编程方式更改按钮 drawableLeft/drawableRight 的颜色。我在我的 xml 中使用了可绘制的色调,如下所述,它可以工作 > api 级别 23 但无法更改颜色 < api 级别 23
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="VIEW ALL"
android:layout_centerInParent="true"
android:background="#00000000"
android:drawableLeft="@mipmap/ic_menu_black_36dp"
android:layout_centerVertical="true"
android:id="@+id/view_all"
android:textColor="@color/bottom_color"
android:drawableTint="@color/bottom_color"
/>
Button prev = (Button) findViewById(R.id.prev);
Drawable[] drawables =prev.getCompoundDrawables();
drawables[0].setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
prev.setCompoundDrawables(drawables[0],null,null,null);
解决方案:
Drawable[] drawablesprev =prev.getCompoundDrawables();
//for drawableleft drawable array index 0
drawablesprev[0].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);
//for drawableright drawable array index 2
drawablesprev[2].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);
//for drawabletop drawable array index 1
drawablesprev[1].setColorFilter(getResources().getColor(R.color.assessment_bottom), PorterDuff.Mode.SRC_ATOP);
您正在使用 PorterDuff.Mode.MULTIPLY
,因此您在乘以颜色。假设(可绘制对象的名称)你的图标是黑色的 - #000000
或者 int
它将是 0
。然后 0 * GRAY
(或任何其他颜色)将始终为您提供 0
,所以仍然是黑色...
尝试其他 PorterDuff.Mode
,例如PorterDuff.Mode.SRC_ATOP
或 PorterDuff.Mode.SRC_IN
您当前的代码可能会使用白色版本的图标,应该使用 MULTIPLY
这是一种为 TextView 或 Button 可绘制对象着色的快速方法:
private void tintViewDrawable(TextView view) {
Drawable[] drawables = view.getCompoundDrawables();
for (Drawable drawable : drawables) {
if (drawable != null) {
drawable.setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_ATOP);
}
}
}
对于 kotlin,这对我有用
your_view.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP)
或者如果您使用资源
your_view.setColorFilter(ContextCompat.getColor(this.baseContext, R.color.colorPrimary), PorterDuff.Mode.SRC_ATOP)
_BTNCancel.getBackground().setAlpha(128);
它将使按钮或任何视图变为 50% 色调
如果您更喜欢使用 XML 代码而不是 JAVA 您可以更改 android:drawableTint
属性到app:drawableTint
.