Android v23 之前的设备上的 TextView DrawableTint
Android TextView DrawableTint on pre v23 devices
有什么方法可以为 TextView
中使用的 Drawable
着色? 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
可绘制对象的方法。
<TextView
style="@style/ChoiceIllustratorTextStyle"
android:drawablePadding="4dp"
android:drawableTop="@drawable/ic_account_balance_white_24dp"
android:text="@string/ci_text_university" />
执行此操作的编程方式是
Drawable[] drawables = textView.getCompoundDrawables();
if (drawables[0] != null) { // left drawable
drawables[0].setColorFilter(color, Mode.MULTIPLY);
}
这适用于所有 API 级别。
这是 pre-Marshmallow 设备的最佳选择。
此答案基于@kris larson 的建议。
我使用了以下方法,它在所有设备上都运行良好。
setTintedCompoundDrawable
一种自定义方法,它采用 TextView
您希望为其设置复合可绘制对象、可绘制资源 ID 和您选择的颜色的资源 ID。
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;
}
AndroidX appcompat 库从版本 1.1.0-alpha03 开始支持在 TextView 中着色 [ref].
将依赖项添加到 appcompat 库
dependencies {
implementation "androidx.appcompat:appcompat:1.1.0"
}
然后 TextView 中的可绘制对象可以像这样从 XML 着色
<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
扩展您的 Activity。
对于这种情况,您可以使用 TextViewCompat
class:
TextViewCompat.setCompoundDrawableTintList(TextView, ColorStateList)
有什么方法可以为 TextView
中使用的 Drawable
着色? 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
可绘制对象的方法。
<TextView
style="@style/ChoiceIllustratorTextStyle"
android:drawablePadding="4dp"
android:drawableTop="@drawable/ic_account_balance_white_24dp"
android:text="@string/ci_text_university" />
执行此操作的编程方式是
Drawable[] drawables = textView.getCompoundDrawables();
if (drawables[0] != null) { // left drawable
drawables[0].setColorFilter(color, Mode.MULTIPLY);
}
这适用于所有 API 级别。
这是 pre-Marshmallow 设备的最佳选择。
此答案基于@kris larson 的建议。
我使用了以下方法,它在所有设备上都运行良好。
setTintedCompoundDrawable
一种自定义方法,它采用 TextView
您希望为其设置复合可绘制对象、可绘制资源 ID 和您选择的颜色的资源 ID。
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;
}
AndroidX appcompat 库从版本 1.1.0-alpha03 开始支持在 TextView 中着色 [ref].
将依赖项添加到 appcompat 库
dependencies {
implementation "androidx.appcompat:appcompat:1.1.0"
}
然后 TextView 中的可绘制对象可以像这样从 XML 着色
<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
扩展您的 Activity。
对于这种情况,您可以使用 TextViewCompat
class:
TextViewCompat.setCompoundDrawableTintList(TextView, ColorStateList)