前言

今天使用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

使用图片混合模式改变点亮图标相关推荐

  1. 基于photoshop滤色混合模式的图片亮度改变

    暗图片亮度增强 根据photoshop的滤色混合方法,完成一种暗图片的亮度增强手段. 滤色混合和正片叠底的公式 形象理解正片叠底和滤色 代码参考-c 先贴一张效果图 简单来说,正片叠底会使暗图片更暗, ...

  2. 必学技术Java Swing之改变咖啡默认图标(建议收藏)

    Java Swing之改变咖啡默认图标 引言:在这里我展示一下改变默认咖啡图标的代码,具体步骤我一一列出来了,有什么疑问的可以联系我哦.(编程软件是Intellij idea) 注:这里介绍一下ide ...

  3. SDWebImage的使用及图片不改变问题的解决

    SDWebImage的使用及图片不改变问题的解决 参考文章: (1)SDWebImage的使用及图片不改变问题的解决 (2)https://www.cnblogs.com/Apologize/p/55 ...

  4. Autorun.inf文件(2):改变硬盘分区图标

    改变F盘图标. 原理:在f盘下新建一个Autorun.inf文件,文件内容是 [AutoRun] icon=favicon.ico 准备名为favicon.ico图标文件,将其放在工程目录里,设计程序 ...

  5. VC2010“添加资源-引入JPG图片”会改变图片大小

    结论: 通过VC2010添加JPG图片(添加资源->引入jpg图片)会改变图片大小. 本身只是为了想给对话框添加一个背景图片,试了下bmp的,都没有问题. 为了测试下是否可以加载(用LoadIm ...

  6. 压缩图片和改变图片图形

    压缩图片和改变图片图形 GitHub网址:https://github.com/qianshao1030/BitmapDemo 包名:compile 'jp.wasabeef:glide-transf ...

  7. background图片叠加_css在图片上叠加层(其他图标)

    css在图片上叠加层(其他图标)2017-09-19 21:51 有时我们在网上购物的时候,经常会看到产品图片上面,会有"特价"."国庆"等标签. 一般人可能会 ...

  8. cesium实现图片与文字合成新图标

    文章目录 1.实现效果 2.实现方法 2.1背景 2.2思路 2.3实现 Cesium实战系列文章总目录: 传送门 1.实现效果 2.实现方法 2.1背景 在Cesium项目开发过程中,需要使用点聚合 ...

  9. 解决word转PDF文件时图片位置改变和字体格式改变的问题

    解决word转PDF文件时图片位置改变和字体格式改变的问题 在写论文的时候,使用word编辑完文本后将其导出为PDF总是出现图片位置改变或者字体格式改变的问题,好不容易在word中编辑好的格式却不能在 ...

最新文章

  1. 魔改宜家灯泡当主机,玩转《毁灭战士》无压力!网友:远超我家第一台电脑...
  2. javascript一句话技巧
  3. vscode请更新includepath_VS Code Java 九月更新!Coding Pack for Java 带来一键安装新体验!...
  4. 程序员面试之MySQL数据库表的设计
  5. 数字图像处理之Canny编程实现
  6. 蓝桥杯小朋友排队java_[蓝桥杯][历届试题]小朋友排队 (C++代码)
  7. php能实现前台的页面吗,thinkphp 能实现前台后台登录吗?
  8. java ee8 mvc1_JavaEE——SpringMVC(1)--@RequestMapping
  9. iOS开发之MAC的内存清理,Xcode清理
  10. 一招解决origin8 licience过期
  11. drupal7 php版本,为内置PHP 5.4服务器提供Drupal 7
  12. 短视频如何添加封面图
  13. 爆款的抖音账号都是如何进行产品定位的
  14. 黑盒测试、灰盒测试、白盒测试、单元测试是什么?它们有什么区别?
  15. 跨利润中心外协业务生成利润中心结算凭证
  16. 双网卡teamviewer linux,钉钉远程打卡2019实践录
  17. 查询用户上次登录时间问题
  18. c语言josephus问题循环链表,循环单链表(C语言,无头节点,附约瑟夫杀人问题)...
  19. 毕业设计之基于springboot的开源商城系统
  20. python个人所得税怎么写分录_个人所得税的凭证分录怎么写

热门文章

  1. PhysX APEX布料导入UE4中碰撞体失效的问题
  2. 学考计算机里分号是哪个,中考电脑阅卷流程曝光!认真看完多拿分!
  3. 十大免费防火墙大盘点
  4. 我对雷达技术的认识与思考
  5. 怎样快速安装适合你计算机环境的project 或VISIO版本
  6. 练手的PS作品(若侵删)
  7. Eclipse中显示空格符、制表符和换行符
  8. 旋变解码(RDC)芯片分析
  9. Calico Kernel's RPF check is set to 'loose'
  10. AVOSCloud(AVOSCloud.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode se