【问题标题】:What is new in Drawable Tinting in Android L Developer Preview compared to previous version?与之前的版本相比,Android L Developer Preview 中的 Drawable Tinting 有哪些新功能?
【发布时间】:2018-02-28 05:44:21
【问题描述】:

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

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

我读到这个this documentation 说:

Android L Developer Preview 允许您定义位图或 九个补丁作为 alpha 蒙版并使用颜色资源对它们进行着色或 解析为颜色资源的主题属性(例如, ?android:attr/colorPrimary)。您只能创建一次这些资产,然后 自动为它们着色以匹配您的主题。

但我不明白它与以前的版本有何不同。我知道如何使用ColorFilterPorterDuffColorFilter 在图像上应用色调。对此的任何帮助将不胜感激。

【问题讨论】:

    标签: android android-drawable android-5.0-lollipop tint


    【解决方案1】:

    从 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" />
    

    【讨论】:

    • 知道如何在TextView 中为可绘制的复合对象着色吗?
    • 你想达到什么效果?就像只为复合可绘制对象中的单层着色还是为整个事物着色?从 XML 还是在运行时?
    • 我的意思是在使用 XML android:drawableLeftTextView 集中的复合可绘制对象。我会期待像android:drawableTint 这样的东西。现在我正在使用代码来获取可绘制对象并设置颜色过滤器。
    • 答案就在你面前。您创建一个可绘制的位图,如@alanv 状态。假设您将其命名为@drawable/my_icon_tinted。设置色调。然后将 TextView 中的可绘制对象用作 drawableLeft。但请注意,XML 布局中的默认色调模式是 SRC_ATOP,但位图中的默认色调模式将是 SRC_IN。
    • 先生。你是个圣人。"android:tint="?android:attr/colorControlNormal" 这件事救了我的命,我要感谢你。祝你有美好的一天。
    【解决方案2】:

    with new Android Support Library 22.1 now more support for tinting possible!

    Support V4 库是许多 Android 支持库并包含许多专注于 使向后兼容更容易。

    DrawableCompat 现在将可绘制着色带回 API 4:只需 wrap 你的 Drawable 通过 DrawableCompat.wrap(Drawable) 和 setTint(), setTintList() 和 setTintMode() 将正常工作:无需创建和 维护单独的可绘制对象仅支持多种颜色!

    Info from Chris Banes blog:

    可绘制着色 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 包装在一个特殊的“tint drawable”中 将自动从 指定的色调。这允许我们处理 ColorStateList 实例。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多