我们有什么方法可以对Drawable
中使用的TextView
进行着色吗? DrawableTint
仅适用于API级别23及更高版本。
目前,我正在使用Vertical Linear Layout
来满足我的要求。
<LinearLayout style="@style/ChoiceIllustratorIconTextContainerStyle">
<ImageView
style="@style/ChoiceIllustratorImageStyle"
android:contentDescription="@string/cd_university"
android:src="@drawable/ic_account_balance_white_24dp" />
<TextView
style="@style/ChoiceIllustratorTextStyle"
android:text="@string/ci_text_university" />
</LinearLayout>
Android工作室建议我使用Compound Drawble
与TextView
来实现此目的。而且我能够实现它,但我无法找到Tint
drawable的方法。
<TextView
style="@style/ChoiceIllustratorTextStyle"
android:drawablePadding="4dp"
android:drawableTop="@drawable/ic_account_balance_white_24dp"
android:text="@string/ci_text_university" />
答案 0 :(得分:15)
执行此操作的编程方法是
Drawable[] drawables = textView.getCompoundDrawables();
if (drawables[0] != null) { // left drawable
drawables[0].setColorFilter(color, Mode.MULTIPLY);
}
这适用于所有API级别。
这是Marshmallow之前设备的最佳选择。
答案 1 :(得分:12)
自版本1.1.0-alpha03 [{ref] 开始,AndroidX appcompat库在TextView中支持着色。
向appcompat库添加依赖项
dependencies {
implementation "androidx.appcompat:appcompat:1.1.0"
}
然后可以像这样从XML着色TextView中的drawable
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:drawableStartCompat="@drawable/ic_plus"
app:drawableTint="@color/red" />
别忘了包含
xmlns:app="http://schemas.android.com/apk/res-auto"
并从AppCompatActivity
开始扩展您的活动。
答案 2 :(得分:10)
这个答案是基于@kris larson的建议。
我使用以下方法,它在所有设备上都能正常工作。
setTintedCompoundDrawable
一种自定义方法,它采用您想要设置复合可绘制的TextView
,一个可绘制的res id&amp;和你选择的颜色。
private void setTintedCompoundDrawable(TextView textView, int drawableRes, int tintRes) {
textView.setCompoundDrawablesWithIntrinsicBounds(
null, // Left
Utils.tintDrawable(ContextCompat.getDrawable(getContext(), drawableRes),
ContextCompat.getColor(getContext(), tintRes)), // Top
null, // Right
null); //Bottom
// if you need any space between the icon and text.
textView.setCompoundDrawablePadding(12);
}
Tint tintDrawable
方法如下:
public static Drawable tintDrawable(Drawable drawable, int tint) {
drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable, tint);
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_ATOP);
return drawable;
}
答案 3 :(得分:1)
在这种情况下,您可以使用TextViewCompat
类:
TextViewCompat.setCompoundDrawableTintList(TextView, ColorStateList)