关于Bitmap中的inBitmap变量的学习与使用
2019独角兽企业重金招聘Python工程师标准>>>
inBitmap是在BitmapFactory中的内部类Options的一个变量,简单而言,使用该变量可以复用旧的Bitmap的内存而不用重新分配以及销毁旧Bitmap,进而改善运行效率。
关于Bitmap的相关知识可以查看我写的Android中Bitmap的深入探讨总结。
inBitmap知识点
inBitmap变量是在Android 3.0+版本加入到系统源码当中,也就意味着inBitmap参数只有在Android 3.0+版本及以上能够正常使用,当你的app版本低于3.0的时候,还是老老实实的使用bitmap.recycle()进行Bitmap的回收操作;在Android 3.0+以上根据系统版本的不同,使用inBitmap的规则也不相同,具体区分如下:
- 4.4之前的版本inBitmap只能够重用相同大小的Bitmap内存区域。简单而言,被重用的Bitmap需要与新的Bitmap规格完全一致,否则不能重用。
- 4.4之后的版本系统不再限制旧Bitmap与新Bitmap的大小,只要保证旧Bitmap的大小是大于等于新Bitmap大小即可。
除上述规则之外,旧Bitmap必须是mutable的,这点也很好理解,如果一个Bitmap不支持修改,那么其内存自然也重用不了。Ok,关于inBitmap的知识点理论上也就那么多。Google为了帮助我们更好的管理Bitmap,也出了一个视频,视频地址如下:
https://www.youtube.com/watch?v=_ioFW3cyRV0&index=17&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
并且附带上了一个使用inBitmap的Demo:
https://developer.android.com/topic/performance/graphics/manage-memory.html#java
下面贴视频中两张图更好的帮助一下理解:
使用inBitmap之前:
使用inBitmap之后:
inBitmap的疑问
针对上述的理解,这里有一个疑问需要去确认一下:
- inBitmap的解码模式跟新Bitmap的不同是否能够重用成功
解决这个疑问可以查看Google官方的inBitmap Demo来回答问题:
/*** candidate:旧的图片,targetOptions:新的图片的Options*/
private fun canUseForInBitmap(candidate: Bitmap, targetOptions: BitmapFactory.Options): Boolean {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// From Android 4.4 (KitKat) onward we can re-use if the byte size of// the new bitmap is smaller than the reusable bitmap candidate// allocation byte count.val width: Int = targetOptions.outWidth / targetOptions.inSampleSizeval height: Int = targetOptions.outHeight / targetOptions.inSampleSizeval byteCount: Int = width * height * getBytesPerPixel(candidate.config)byteCount <= candidate.allocationByteCount} else {// On earlier versions, the dimensions must match exactly and the inSampleSize must be 1candidate.width == targetOptions.outWidth&& candidate.height == targetOptions.outHeight&& targetOptions.inSampleSize == 1}
}/*** A helper function to return the byte usage per pixel of a bitmap based on its configuration.*/
private fun getBytesPerPixel(config: Bitmap.Config): Int {return when (config) {Bitmap.Config.ARGB_8888 -> 4Bitmap.Config.RGB_565, Bitmap.Config.ARGB_4444 -> 2Bitmap.Config.ALPHA_8 -> 1else -> 1}
}
这里可以看出,只要新的Bitmap的内存小于旧Bitmap的内存大小,即可进行复用的操作,那么跟解码模式没有必然的联系。
inBitmap的使用
关于inBitmap的使用,可以根据谷歌的官方例子进行设计和开发,不过维护起来需要一定的工作量。当然在市面上成熟的图片框架中,如Glide内部也使用了inBitmap作为缓存复用的一种方式。总而言之,根据项目以及业务来选择实现方式即可,不必过分纠结。
转载于:https://my.oschina.net/u/3863980/blog/3019921
关于Bitmap中的inBitmap变量的学习与使用相关推荐
- js 声明数组和向数组中添加对象变量 [前端学习 第七节]
转载文章:http://blog.csdn.net/icanlove/article/details/40818559 数组有四种定义的方式 使用构造函数: var a = new Array() ...
- java怎么给类中的私有变量赋值_Java学习笔记分享 如何理解接口抽象类和关键字...
不知不觉中,千锋重庆学习Java已经半个月了,同学们感觉受益匪浅.有一个同学本来是软件编程专业基础却是意外的差,什么标识符.变量的命名规则.方法的定义.数组.面向对象的封装.继承.多态,还有接口.抽象 ...
- 【Linux学习笔记】27:环境变量中的语系变量
语系就是用的是什么人类语言,本节专门学习环境变量中的语系变量. [1]locale确定系统当前语系 [root@bogon ~]# locale LANG=zh_CN.UTF-8 LC_CTYPE=& ...
- matlab中句点,matlab入门学习(一)
今天是我第一天学习matlab软件,受教练嘱托,在雷神走之前一定要实现数学建模入门..先说说装软件吧,可真的是个蛋疼的问题,反正是装了 好久,装了一个云端版本的软件R2009a 的软件有点大1.4G哇 ...
- Ant build.xml中的各种变量
http://blog.csdn.net/hittata/article/details/4744653 Ant环境变量分为四种: 1. build.properties文件中定义的变量 2 ...
- 能否用痰盂盛饭——谈谈在头文件中定义外部变量
能否用痰盂盛饭--谈谈在头文件中定义外部变量 - garbageMan - 博客园 能否用痰盂盛饭--谈谈在头文件中定义外部变量 "能否用痰盂盛饭"并非是一个技术问题,而是一个哲学 ...
- matlab静态变量怎样分配内存,matlab中的静态变量
persistent X Y Z 将X,Y,Z定义为在其声明处的函数的局部变量.然而,这些变量的值在函数调用期间在内存中保存(应该是堆区).Persistent 变量和global(全局)变量相似,因 ...
- r中如何求变量的对数转换_对数转换以求阳性。
r中如何求变量的对数转换 In Simple terms, log transform squashes or compresses range of large numbers and expand ...
- linux系统中变量,Linux系统中的环境变量知识详解
对于没有使用过linux系统的用户来说,有很多术语和功能都很陌生.本文就介绍了linux系统中的环境变量的相关知识,具体内容如下所述. linux是一个多用户的操作系统.每个用户登录系统后,都会有一个 ...
最新文章
- 在pycharm中无法引入同一目录下的python文件
- 数十名工程师作战5天,阿里达摩院连夜研发智能疫情机器人
- 七夕福利 | 3D视觉从入门到精通系统学习教程
- MySQL性能优化(八)
- CEF(包含均衡负载)
- python定义方法self会被当作变量_为什么Python必须在方法定义和调用中显式使用“self”?...
- 【Nutch2.3基础教程】集成Nutch/Hadoop/Hbase/Solr构建搜索引擎:安装及运行【集群环境】
- LeetCode 646. 最长数对链(区间 贪心)
- RK3288 error: undefined reference to 'LOGD'
- 我读研期间通过实习和比赛收入五十万
- Urllib3 库详解
- MySQL 性能优化一
- HDU2030-汉字机内码
- unity简易游戏制作
- 模拟测试数据的生成方法
- 服务器系统开启telnet,Telnet怎么打开 Win7/Win8系统开启Telnet服务方法图解
- 丹佛机场行李系统案例分析
- Wox自制主题 - Material
- 2021全国职业技能大赛-网络安全赛题解析总结②(超详细)
- 打破次元壁,让游戏角色在指尖跳舞,简易的 AR 教程
热门文章
- netty java开发文档_《Netty官方文档》设置开发环境
- linux sh脚本 递增,Linux shell 脚本实现进度框
- axios获取header中的信息_Axios请求头中常见的Content-Type及其使用
- python异常处理操作语句_异常处理语句(2)
- linux系统怎么建ftp服务器地址,Ubuntu Linux系统建立FTP服务器方法步骤
- android 设计qq界面,[考试求助]仿照腾讯QQ应用软件,编写Android程序,登录界面设计...
- php consul 服务注册,CentOS 安装 Consul 服务注册和发现软件
- 操作系统饥饿现象_操作系统常见面试题
- image vb6 图片自适应_请问如何实现图片在窗体上的大小自适应?
- java公路车 superma_SuperMac80