使用图片混合模式改变点亮图标
前言
今天使用ImageView.setColorFilter()方法的时候,在A界面改变一个drawable状态,其他B,C,D…若引用了这个drawable则会同样的进行状态改变,我想这应该是android的内存优化的机制,下面我先来简单整理梳理下知识。
点亮图标
如果常做应用App开发,通常会有一个图标点亮的功能需求。
改变当前图标的颜色,用于表示该操作处于某个状态。一般的操作,可能直接准备两张图片,不同状态对应相应的图片stateA<->imgA,stateB<->imgB
。这里介绍另外一种实现的方法,
ImageView.setColorFilter()
Specify a color and Porter-Duff mode to be the color filter for this drawable.
imageView.getDrawable().setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary),PorterDuff.Mode.SRC_IN);
上面两个都提到了PorterDuff,那这是什么呢?
PorterDuff.Mode
PorterDuff,一个陌生的单词,百度翻译和谷歌翻译都查无来处,原因在于它是一个组合词汇,来源于 Tomas Proter(托马斯波特)和 Tom Duff(汤姆达)两个名字。这俩人是在图形混合方面的大神级人物,他们在 1984 年发表了论文,第一次提出了图形混合的概念,也是取了两人的名字命名。Android PorterDuff.Mode 便是提供了图片的各种混合模式,可以分为两类:
Alpha compositing modes(由俩大神的定义,包含 alpha 通道因素)
Blending modes(不是俩大神的作品,不包含 alpha 通道因素)
具体的可以看官方文档对 PorterDuff.Mode的介绍。
简单来说,就是原图片source和目标图片desitination根据mode的配置合成一个新的图片,具体的Mode如下。
异常优化
因为Android的内存优化机制,若引用同一个drawable,在A界面改变一个drawable状态,其他B,C,D…若引用了这个drawable则会同样的进行状态改变。解决此问题需要用到Drawable类的mutate函数:
mutate()
A mutable drawable is guaranteed to not share its state with any other drawable.
此方法会拷贝一个drawable出来进行操作,更改状态后并不会到source drawable
的任何属性,非常实用。
iconIv.getDrawable().mutate().setColorFilter(ContextCompat.getColor(JMUITextActivity.this, R.color.colorPrimary),PorterDuff.Mode.SRC_IN);
参考链接
- newdrawable Vs mutate
- 自定义View-第十九步:Paint之setColorFilter
使用图片混合模式改变点亮图标相关推荐
- 基于photoshop滤色混合模式的图片亮度改变
暗图片亮度增强 根据photoshop的滤色混合方法,完成一种暗图片的亮度增强手段. 滤色混合和正片叠底的公式 形象理解正片叠底和滤色 代码参考-c 先贴一张效果图 简单来说,正片叠底会使暗图片更暗, ...
- 必学技术Java Swing之改变咖啡默认图标(建议收藏)
Java Swing之改变咖啡默认图标 引言:在这里我展示一下改变默认咖啡图标的代码,具体步骤我一一列出来了,有什么疑问的可以联系我哦.(编程软件是Intellij idea) 注:这里介绍一下ide ...
- SDWebImage的使用及图片不改变问题的解决
SDWebImage的使用及图片不改变问题的解决 参考文章: (1)SDWebImage的使用及图片不改变问题的解决 (2)https://www.cnblogs.com/Apologize/p/55 ...
- Autorun.inf文件(2):改变硬盘分区图标
改变F盘图标. 原理:在f盘下新建一个Autorun.inf文件,文件内容是 [AutoRun] icon=favicon.ico 准备名为favicon.ico图标文件,将其放在工程目录里,设计程序 ...
- VC2010“添加资源-引入JPG图片”会改变图片大小
结论: 通过VC2010添加JPG图片(添加资源->引入jpg图片)会改变图片大小. 本身只是为了想给对话框添加一个背景图片,试了下bmp的,都没有问题. 为了测试下是否可以加载(用LoadIm ...
- 压缩图片和改变图片图形
压缩图片和改变图片图形 GitHub网址:https://github.com/qianshao1030/BitmapDemo 包名:compile 'jp.wasabeef:glide-transf ...
- background图片叠加_css在图片上叠加层(其他图标)
css在图片上叠加层(其他图标)2017-09-19 21:51 有时我们在网上购物的时候,经常会看到产品图片上面,会有"特价"."国庆"等标签. 一般人可能会 ...
- cesium实现图片与文字合成新图标
文章目录 1.实现效果 2.实现方法 2.1背景 2.2思路 2.3实现 Cesium实战系列文章总目录: 传送门 1.实现效果 2.实现方法 2.1背景 在Cesium项目开发过程中,需要使用点聚合 ...
- 解决word转PDF文件时图片位置改变和字体格式改变的问题
解决word转PDF文件时图片位置改变和字体格式改变的问题 在写论文的时候,使用word编辑完文本后将其导出为PDF总是出现图片位置改变或者字体格式改变的问题,好不容易在word中编辑好的格式却不能在 ...
最新文章
- 魔改宜家灯泡当主机,玩转《毁灭战士》无压力!网友:远超我家第一台电脑...
- javascript一句话技巧
- vscode请更新includepath_VS Code Java 九月更新!Coding Pack for Java 带来一键安装新体验!...
- 程序员面试之MySQL数据库表的设计
- 数字图像处理之Canny编程实现
- 蓝桥杯小朋友排队java_[蓝桥杯][历届试题]小朋友排队 (C++代码)
- php能实现前台的页面吗,thinkphp 能实现前台后台登录吗?
- java ee8 mvc1_JavaEE——SpringMVC(1)--@RequestMapping
- iOS开发之MAC的内存清理,Xcode清理
- 一招解决origin8 licience过期
- drupal7 php版本,为内置PHP 5.4服务器提供Drupal 7
- 短视频如何添加封面图
- 爆款的抖音账号都是如何进行产品定位的
- 黑盒测试、灰盒测试、白盒测试、单元测试是什么?它们有什么区别?
- 跨利润中心外协业务生成利润中心结算凭证
- 双网卡teamviewer linux,钉钉远程打卡2019实践录
- 查询用户上次登录时间问题
- c语言josephus问题循环链表,循环单链表(C语言,无头节点,附约瑟夫杀人问题)...
- 毕业设计之基于springboot的开源商城系统
- python个人所得税怎么写分录_个人所得税的凭证分录怎么写
热门文章
- PhysX APEX布料导入UE4中碰撞体失效的问题
- 学考计算机里分号是哪个,中考电脑阅卷流程曝光!认真看完多拿分!
- 十大免费防火墙大盘点
- 我对雷达技术的认识与思考
- 怎样快速安装适合你计算机环境的project 或VISIO版本
- 练手的PS作品(若侵删)
- Eclipse中显示空格符、制表符和换行符
- 旋变解码(RDC)芯片分析
- Calico Kernel's RPF check is set to 'loose'
- AVOSCloud(AVOSCloud.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode se