与以前的版本相比,Android L Developer Preview中的Drawable Tinting有什么新功能?

And*_*ter 20 android tint android-drawable android-5.0-lollipop

我正在开发新的Android L预览版,现在处理drawable上的着色概念.

我想知道Android L Developer Preview中是否有关于可绘制着色的新内容.

我读到这篇文档说:

Android L开发人员预览版使您可以将位图或九个修补程序定义为alpha蒙版,并使用颜色资源或解析为颜色资源的主题属性对其进行着色(例如, ?android:attr/colorPrimary).您只能创建一次这些资源并自动着色以匹配您的主题.

但我不明白它与以前的版本有什么不同.我知道如何使用ColorFilterPorterDuffColorFilter在图像上应用色调.任何有关这方面的帮助将不胜感激.

ala*_*anv 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" />
Run Code Online (Sandbox Code Playgroud)

默认控件全部使用?android:attr/colorControlNormal用于正常状态(例如未选中复选框)和?android:attr/colorControlActivated(默认情况下映射到?android:attr/colorAccent)用于其激活状态(例如,已选中)复选框).

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

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/my_icon"
    android:tint="?attr/myThemeAttribute" />
Run Code Online (Sandbox Code Playgroud)

  • 我的意思是使用XML`android:drawableLeft`在`TextView`集中绘制一个复合体.我本来期待像`android:drawableTint`这样的东西.现在我正在使用代码来获取drawable并设置一个颜色过滤器. (5认同)
  • 任何想法如何在`TextView`中着色复合drawable? (4认同)
  • 答案就在你面前.您创建了一个位图可绘制为@alanv状态.假设您将其命名为@ drawable/my_icon_tinted.设置色调.然后在TextView中将drawable用作drawableLeft.但要小心,XML布局中的默认色调模式是SRC_ATOP,但位图中的默认色调模式是SRC_IN. (2认同)

LOG*_*TAG 13

随着新的Android支持库22.1现在更多支持着色可能!

Support V4库是许多Android支持库的基础,包含许多专注于使向后兼容性更容易的类.

DrawableCompat现在将可绘制的着色带回API 4:只需通过DrawableCompat.wrap(Drawable)和setTint(),setTintList()和setTintMode()包装Drawable就可以了:不需要创建和维护单独的drawable只支持多个颜色!

来自Chris Banes博客的信息:

可绘制着色Lollipop中添加的Drawable着色方法对于让您动态着色资产非常有用.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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

<TintImageView
android:layout_width=""
android:layout_height="" 
android:src=""
android:backgroundTint="@color/green"/>
Run Code Online (Sandbox Code Playgroud)

但如果我想改变EditText TextView的drawable left | right图标,我觉得没有办法做到这一点!