通常状态图片至少会有两种颜色,按下,普通。一般会切两张图片出来。但是绝对有必要吗?
比如下面的wifi标记

方法一:

Drawable originalDrawable =getResources().getDrawable(R.mipmap.ic_loading_error);ivA.setImageDrawable(originalDrawable);ivA.setClickable(true);ivA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击后变色Drawable drawable = colorDrawable(v.getResources(),R.mipmap.ic_loading_error,R.color.blue);ivA.setImageDrawable(drawable);}});public Drawable colorDrawable(Resources res,@DrawableRes int drawableResId, @ColorRes int colorResId) {Drawable drawable = res.getDrawable(drawableResId);int color = res.getColor(colorResId);drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);return drawable;}

在点击图片后,会变成蓝色

魔术的关键的一行是
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
如何明确是变哪里的颜色是由 PorterDuff.Mode.SRC_IN来决定的。那它又是啥意思呢?

magic,他居然能够分辨图层,然后根据图层间的关系来决定变色的区域。
那好,如果我想让上面的那张图片变色的是其背景,用SRC_OUT吧。

我在使用过程中发现,该法操作后,会将drawable在内存中的唯一拷贝给修改了,所以当再次读取该drawable都是被改变后的drawable.

方法二:

Drawable originalDrawable = getResources().getDrawable(R.mipmap.ic_loading_error);ivA.setImageDrawable(originalDrawable);/*** 如果不加mutate的话: Android 为了优化系统性能,资源 Drawable 只有一份拷贝,你修改了它,等于所有的都修改了(ivA 和 ivB)。如果你给两个 View 设置同一个资源,*也是就是他们是共享状态的。* 幸运的是,Drawable 提供了一个方法 mutate(),来打破这种共享状态,等于就是要告诉系统,我要修改(mutate)这个 Drawable。*/Drawable originalDrawable2 = getResources().getDrawable(R.mipmap.ic_loading_error).mutate();ivB.setImageDrawable(tinyDrawable(originalDrawable2, ColorStateList.valueOf(Color.GREEN)));public static Drawable tinyDrawable(Drawable drawable, ColorStateList colorStateList) {Drawable wrapedDrawable = DrawableCompat.wrap(drawable);DrawableCompat.setTintList(wrapedDrawable, colorStateList);return wrapedDrawable;}

总结:

说的很清楚了,同一个图片的drawable在程序里是共用的,方式一很适合来作为一个按钮不同的按下状态展示 ,但如果该画面同时还有另一个按钮也用同一个drawable,那可就不行了,一改全改了。

减少资源消耗方法之一:减少状态图片相关推荐

  1. 百万 Go TCP 连接的思考: epoll方式减少资源占用

    强烈推荐: 鸟窝 https://colobu.com/ 百万 Go TCP 连接的思考: epoll方式减少资源占用 前几天 Eran Yanay 在 Gophercon Israel 分享了一个讲 ...

  2. android h5游戏图片不缓存,H5小游戏资源缓存方法与流程

    本发明涉及H5资源缓存领域,尤其涉及H5小游戏资源缓存方法. 背景技术: 随着移动互联网的发展和手机硬件性能的不断提升,H5小游戏这种不需要下载安装即可使用的全新游戏应用得到了爆发式发展.这种用完即走 ...

  3. Hive优化【提高效率,减少资源浪费等】

    一.谨慎使用API 大数据场景下,必然是有大量的数据,因此大数据场景下并不怕数据量大,不行可多开几个节点,用以存储.但是大数据场景下,害怕的是数据倾斜,如果使用不当API,很容易造成数据倾斜问题. 容 ...

  4. 提高C++程序运行效率,减少运行时间的方法

    大致方法: 1.优化业务逻辑,尽量少做事情. 2.减少网络访问,IO等对外操作. 3.如果有数据库,优化SQL和数据库结构. 4.优化算法,比如冒泡排序改成快排等. 5.优化代码的编写.这个就很多了. ...

  5. 【操作系统】王道考研 p59-60 减少延迟时间的方法、磁盘的管理

    减少延迟时间的方法 磁盘的管理 以下是减少延迟时间的方法的内容 前情回顾 简而言之:如果要读写逻辑上相邻的盘片会延长时间,因为读写完一个盘片后要处理一段时间,处理完已经转过想要读的下一个盘片了. 磁盘 ...

  6. spark减少内存消耗_将内存消耗减少20倍

    spark减少内存消耗 这将是另一个故事,与我们分享有关内存相关问题的最新经验. 该案例是从最近的客户支持案例中提取的,在该案例中,我们遇到了一个行为异常严重的应用程序,该应用程序因生产中的OutOf ...

  7. (王道408考研操作系统)第四章文件管理-第二节3:减少延迟时间的方法

    文章目录 一:关于延迟时间 二:减少延迟时间的方法 (1)交替编号 (2)错位命名 一:关于延迟时间 前面说过,延迟时间是指通过旋转磁盘,使磁头定位到目标扇区所需要的时间. 如下,理想化的延迟时间就是 ...

  8. MFC程序减少体积的方法

    MFC程序减少体积的方法 我们先新创建一个MFC程序: 去掉安全开发周期检查,在静态库中使用MFC 默认 创建好之后我们编译看一下体积: DEBUG:9MB多 RELEASE:3MB多(优化代码) 可 ...

  9. 简谈FPGA设计中不同设计方法资源消耗对比

    简谈FPGA设计中不同设计方法资源消耗对比 今天和大侠简单聊一聊FPGA设计中不同设计方法硬件资源消耗对比,话不多说,上货. 在这里,我们使用Verilog HDL 设计计数器,通过两种不同的写法,对 ...

最新文章

  1. Google瓦片地图算法解析
  2. jQuery 1.10.0 和 2.0.1 发布
  3. java exception 乱码_java 常见中文乱码问题解决
  4. 用python做公众号网页_Python---微信公众号或网页自动导出
  5. 计算机考试换机密码,Ami换机,让你轻松转移手机资料!
  6. [Vue.js]实战 -- 电商项目(二)
  7. springmvc为什么不能拦截jsp页面?
  8. 16-margin的用法
  9. 在python程序中嵌入浏览器_用Python中的wxPython实现最基本的浏览器功能
  10. Objective-C 与JAVA的SHA1/HmacSHA1加密算法实现
  11. python的代码保存到文档中 打不开怎么办_Python 制作网页打不开 直接跳到打开或者保存文件...
  12. 软考中级数据库系统工程师备考经验分享
  13. 【Java面试题】利用5升和6升两个水桶得到3升水
  14. EVE-NG 上传IOL镜像
  15. C语言从一段字符串中提取IP地址的方法
  16. 解决netsh winsock reset找不到指定文件
  17. FPV救援四足机器人设计(1)
  18. matlab数据归一化(补充),matlab数据归一化(补充)
  19. 文件系统之重新安装系统、如何新增一块盘
  20. 你见过最奇葩的代码提交信息是什么?别再为写commit message头疼了!

热门文章

  1. 灰色预测模型代码_生信审稿人最常问的验证!临床预测模型中的PCA主成分分析!这点你注意到了没!(附代码)...
  2. Coding and Paper Letter(二十四)
  3. [BZOJ3262]陌上花开
  4. WPF:Graphics图表--EncodingAndersonDecoding图像编解码(2)
  5. MVC使用 Elmah 日志记录组件
  6. 位置相关属性offset(),position(),scrollTop()等
  7. Django-Ajax
  8. 常用的第三方模块 Pillow url
  9. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
  10. [luogu4571 JSOI2009] 瓶子和燃料 (数论)