博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android笔记之ColorFilter:图片点击变暗
阅读量:5953 次
发布时间:2019-06-19

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

一、ColorFilter似个嘛

小德在做一个imageview点击会变暗的效果的时候设置的这个ColorFilter,类如其名,介就似个色彩过滤器,用的好的话能像美工一样ps你的imageview。

二、ColorFIlter用在哪

ImageView和Drawable里边都有SetColorFilter方法,但查看Imageview源码就发现在Imageview里边最后还是调用了Drawable的set方法,但是这里有个小坑,我们最后再看。

三、怎么用

ColorFilter有三个子类,我们一般用的就是这仨弟弟。

接下来就来介绍这仨弟弟。

3.1 LightingColorfilter

首先我们看一下这个类的介绍。

我们明白了这个类是用来模拟简单的光照影响,接收两个参数:一个叫做ColorMultiply,另一个是ColorAdd,他们的计算方式在文档中也说明了,而且颜色中的alpha通道关闭了,所以alpha的值不会影响到结果。

R' = R * colorMultiply.R + colorAdd.R

G' = G * colorMultiply.G + colorAdd.G
B' = B * colorMultiply.B + colorAdd.B

虽然是两个参数但是上边的计算公式分别有三个值,colorMultiply.R/G/B和colorAdd.R/G/B的意思是颜色代码(十六进制)中的ARGB,也就是说#FFFFFFFF每两位对应的是A(Alpha,透明度)RGB

(啊 话说小德最近中了RGB的毒

3.2 PoterDuffColorFilter

还是先看文档介绍

简单来说就是使用一个单一的颜色和PoterDuff模式来改变source。
单一的颜色我们知道,但是这个PoterDuff似个嘛?(那张图他要lei了)

其实就是一种混合模式,这个类除了在colorfilter中使用还有其他用处,大家可以自己了解一下
(怎么可能因为小德还没整明白

3.3 ColorMatrixColorFilter

重点来了,带矩阵的过滤器。还是先看文档:

重点就是那个4×5的矩阵来变换颜色。那具体怎么变换的呢:

矩阵相乘就是变换后的RGBA矩阵。
(没学好线代的小德跪了) 这个矩阵能做到什么事情就请咨询你们的美工吧,变个色只是基本操作。

四、回到标题,变暗

小德使用的是PoterDuffColorFilter,使用灰色过滤,选的模式是 PorterDuff.Mode.MULTIPLY

imageView.getDrawable().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);复制代码

话说点击就不用小德多说了吧。或者说变回来就clear掉colorfilter就好了。

imageView.getDrawable().clearColorFilter();复制代码

五、还有那个坑呢

当时的问题是我最开始给drawable设置了colorfilter,当然也是clear了drawable的。但我发现了自己人写的工具类有这个设置colorfilter的方法,正好也是变暗的效果,我就直接用起来了。

但是之后就出现bug了,imageview设置图片的时候虽然我没点击(其实debug也发现根本没进入到ontouch里边)imageview,图片依然变暗了。最后才发现是工具类给imageview设置了colorfilter,但我clear的是drawable的,在imageview中其实还保存着之前的colorfilter,所以我重新设置图片的时候drawable就带上了之前的colorfilter。
所以,谨记给谁设置的colorfilter就清掉谁的,除非也想像小德一样用了一个下午找问题。

//作为Android开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。希望与大家一同进步。

转载地址:http://rcoxx.baihongyu.com/

你可能感兴趣的文章
React 组件通信之 React context
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
从前后端分离到GraphQL,携程如何用Node实现?\n
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
nginc+memcache
查看>>
linux下crontab实现定时服务详解
查看>>
Numpy中的random模块中的seed方法的作用
查看>>
关于jsb中js与c++的相互调用
查看>>
POJ-2251 Dungeon Master
查看>>
tortoisesvn的安装
查看>>
URAL 1353 Milliard Vasya's Function DP
查看>>
速读《构建之法:现代软件工程》提问
查看>>
Android onclicklistener中使用外部类变量时为什么需要final修饰【转】
查看>>
django中聚合aggregate和annotate GROUP BY的使用方法
查看>>