20

I am working of new Android L preview and now dealing with tinting concept on drawable.

I want to know if there is anything new regarding drawable tinting in Android L Developer Preview.

I read this this documentation which says:

The Android L Developer Preview enables you to define bitmaps or nine-patches as alpha masks and to tint them using a color resource or a theme attribute that resolves to a color resource (for example, ?android:attr/colorPrimary). You can create these assets only once and color them automatically to match your theme.

But I didn't understand how it is different from previous version. I know how to use ColorFilter or PorterDuffColorFilter to apply tint on image. Any help regarding this will be appreciated.

4

2 回答 2

21

从 L 开始,您可以在 XML 中指定色调。这些可以引用主题属性(如图所示)、颜色状态列表、颜色资源或显式十六进制颜色代码。默认情况下,着色模式为 SRC_IN,但可以使用 android:tintMode 属性将其设置为其他值。

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/my_icon"
    android:tint="?android:attr/colorControlNormal" />

默认控件都使用 ?android:attr/colorControlNormal 作为其正常状态(例如未选中的复选框)和 ?android:attr/colorControlActivated (默认映射到 ?android:attr/colorAccent)作为其激活状态(例如选中复选框)。

您可以在自己的应用程序可绘制对象中使用这些属性来继承默认的框架颜色,或者您可以重新定义它们以更改默认或激活的控件颜色。您还可以引用特定于您的应用程序的属性(如图所示)。

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/my_icon"
    android:tint="?attr/myThemeAttribute" />
于 2014-08-26T00:14:51.320 回答
13

有了新的Android 支持库 22.1,现在可以为着色提供更多支持!

Support V4 库作为大部分 Android 支持库的基础,包含许多专注于使向后兼容更容易的类。

DrawableCompat 现在将 drawable 着色带回 API 4:只需通过 DrawableCompat.wrap(Drawable) 和 setTint() 包装您的 Drawable,setTintList() 和 setTintMode() 即可工作:无需创建和维护单独的 drawable,仅支持多个颜色!

来自 Chris Banes 博客的信息:

可绘制着色 Lollipop 中添加的可绘制着色方法对于让您动态着色资产非常有用。AppCompat 在 v21 支持库中有自己的实现,我们现在将其提取到 support-v4 中的 DrawableCompat 中供所有人使用。重要的是要知道它是如何工作的。

Drawable drawable = ...;

// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);

// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);

要记住的是,在你调用之后DrawableCompat.wrap(),你不能依赖结果与你给它的类型相同。相反,您应该使用DrawableCompat.unwrap()来检索原始的 Drawable。

在内部,我们现在将您的 Drawable 包装在一个特殊的“tint drawable”中,它将自动从指定的色调更新您的 Drawable 的颜色过滤器。这允许我们处理 ColorStateList 实例。

但我想知道如何使用它 xml !有一个选项叫做

<TintImageView
android:layout_width=""
android:layout_height="" 
android:src=""
android:backgroundTint="@color/green"/>

但是如果我想更改 EditText TextView 的可绘制左|右图标,我觉得没有办法做到这一点!

于 2015-05-29T07:18:55.147 回答