博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ColorFilter and Tint
阅读量:4195 次
发布时间:2019-05-26

本文共 3055 字,大约阅读时间需要 10 分钟。

概述

关于Android ColorFilter 和 Tint之间的关系一直混淆不清。两者均是对显示的图片进行着色或者过滤。

ColorFilter: 色彩过滤

Tint: 着色

从英文原意上来讲,似乎有些相似,而从实际的效果来讲也是一致的。Android 向导文档似乎对此也是一笔带过,不愿深入,让人有些摸不着头脑:

With Android 5.0 (API level 21) and above, you can tint bitmaps and nine-patches defined as alpha masks. You can tint them with color resources or theme attributes that resolve to color sources (for example, ?android:attr/colorPrimary). Usually, you create these assets only once and color them automatically to match your theme.

You can apply a tint to or objects with the method. You can also set the tint color and mode in your layouts with the android:tint and android:tintMode attributes.

这段文字讲述的大意是:Tint 是 API 21之后才添加的功能,可以对和 应用Tint 效果。使用tint效果可以省去我们为不同theme创建同一张图片的多个版本的麻烦。紧接着第二段讲道如何使用tint, 有两种方法:

1 调用函数:

class Drawable {     ...     public void setTint (int tint);                       //Added in API 21     public void setTintMode (PorterDuff.Mode tintMode);   //Added in API 21     ...}

2 XML Layout:

drawable file location: res/drawable/tintedrawable.xml

layout file location: res/layout/layout_main.xml


ImageView and Tint

class ImageView {    public final void setColorFilter (int color, PorterDuff.Mode mode); //Added in API 1    public void setImageTintList (ColorStateList tint);                 //Added in API 21    public void setImageTintMode (PorterDuff.Mode tintMode);            //Added in API 21}

除了 可以继续使用setColorFilter(int, PorterDuff.Mode), API 21 也给 添加了setImageTintList(), setImageTintMode(), android:tint, android:tintMode 等特性!


首先我们看一个Sample, 给一个 使用这三种不同方法来着色。

@Override    public View onCreateView(LayoutInflater inflater,         ViewGroup container, Bundle savedInstanceState) {        View v = inflater.inflate(R.layout.tinting_fragment, null);        mImage1 = (ImageView) v.findViewById(R.id.image1);        mImage2 = (ImageView) v.findViewById(R.id.image2);        updateTint( Color.argb(0xFF, 0x67, 0x3A, 0xB7),            PorterDuff.Mode.MULTIPLY );    }    public void updateTint(int color, PorterDuff.Mode mode) {        mImage1.setColorFilter(color, mode);        mImage2.setImageTintList(ColorStateList.valueOf(color));        mImage2.setImageTintMode(mode);    }

显示效果

从上图可以看到, 其实对于 不管采用何种方法,其最终的结果都是一样的。


我们看到ImageView.setImageTintList(ColorStateList) 实际上是接受一个参数,上面我们android:tint="#673AB7"的tint值是一个单一的颜色,如果改成那效果如何呢?

1 res/color/custom_tint.xml

2 res/layout/layout_main.xml

显示效果

当点击最下面的 的时候, 颜色并没有随着状态的改变而改变。接着我们再把 改成:

显示效果


Drawable and Tint

文档里面明确讲明了tint的引入是为了对 进行着色支持。至少对于和 文档明确指明了支持 android:tintandroid:tintMode 属性。这样的话我们对于android:tint的属性的支持就很容易从扩展到任何, 只要将的android:background指向我们自定义的drawable:

1 res/drawable/tintedrawable.xml

2 res/layout/layout_main.xml

但是和上面的问题一样,使用这种方法不支持多状态的情形。而如果我们将xml layout 中的 改成并且将android:background 改成android:src问题就解决了: 

显示效果

上面的两张图片分别是在默认状态和按下状态的着色的效果。如果换成其他的View, 红色着色并不会出现,但是仍然会有绿色的着色效果。

通过以上的分析,发现对于tint在各个状态下自动改变着色色彩的支持仍然仅仅局限于, 这里或许我们可以通过自定义的方法来修正这个问题,但是如果能够做到系统原生的支持当然更好,期待读者能够提供更好的方法。

你可能感兴趣的文章
程序员如何缓解“电脑病”
查看>>
JNDI介绍及常用应用服务器的EJB调用
查看>>
Jms Topic和Queue的比较
查看>>
Spring BlazeDs 集成问题
查看>>
Flex Data Binding详解
查看>>
Flex基本原理
查看>>
Flex样式工作原理
查看>>
PostgreSQL使用注意事项
查看>>
Hibernate延时加载
查看>>
ORACLE中的物化视图
查看>>
Flex Datagrid 三类背景色设定
查看>>
理解Flex itemRenderer(1)--内联渲染器
查看>>
理解Flex itemRenderer(3)--通信
查看>>
理解Flex itemRenderer(4)--状态和过渡
查看>>
理解Flex itemRenderer(5)--效率
查看>>
FLEX数据类型和JAVA数据类型对应关系表
查看>>
迈向工程硕士
查看>>
Flex国际化(I18N )
查看>>
软件需求变更管理
查看>>
CruiseControl持续集成
查看>>