- 1.Bitmap 内存占用的计算
宽 * 高 * 一个像素点占用的字节数 每行占用的字节,bitmapfatroy默认储存方式时argb_8888,一个像素占用4个字节
- 2.getByteCount() & getAllocationByteCount()的区别 如果不使用内存复用,这两个方法是一样的效果。 如果在使用复用的情况下,在通过复用 Bitmap 来解码图片时,那么 getByteCount() 表示新解码图片占用内存的大 小,getAllocationByteCount() 表示被复用 Bitmap真实占用的内存大小。
举例说明,现在bitmap存入了一个图片,占用了4兆内存,那么这个图片不用时,bitmap被缓存下来,重新用一个图片复用了这个bitmap,但是这个图片只有1兆,那么此时从getbytecount获取到的bitmap对象大小时1兆,也就是实际图片的大小,但是bitmap在内存中实际占用了4兆,如果使用getAllocationByteCount(),那么获取的bitmap占用的大小就是bitmap在内存中实际大小,也就是4兆
- 3.Bitmap的压缩方式
可采用的压缩方法:
质量压缩:内存不变,压缩转化后的 bytes.length 减少,适用于传输,png 无效 采样率压缩(Options):改变宽高,减少像素,采用一定的采样算法 缩放法压缩(Matrix):改变宽高,减少像素,采用一定的缩放算法(数字图像处理相关) RGB_565:改变字节数
- 4.LruCache & DiskLruCache原理
都是使用lru(最近最少)算法
LruCache内存缓存,DiskLruCache存储设备缓存(磁盘缓存)不是Android sdk里面的,需要导包,是操作本地文件的
5.有一张非常大的图片,如何去加载这张大图片 在没有压缩图片的情况下,不建议一次性把图片加载到内存中,而是使用分片加载的方式,使用bitmapRegionDecoder分片加载的方式显示部分内容,然后根据手势操作,放大缩小或移动图片加载的位置
- 7.如果把drawable-xxhdpi下的图片移动到drawable-xhdpi下,图片内存是如何变的。 在bitmapfactory解析图片的过程中,会根据当前手机密度和图片所在drawable目录对应的屏幕密度做一个对比,根据这个对比值进行缩放处理
缩放比例 = 当前手机密度哦 / drawable所在目录对应的密度
bitmap大小= 宽 * 缩放比例 *高 *缩放比例 * 对应储存像素数
如果在hdpi、xxhdpi下放置了图片,加载的优先级。如果是400800,10801920,加载的优先级。
如果手机屏幕和对应图片所在目录相同,那么会直接使用对应目录下的图片,如果不存在,那么会去对应drawable密度比手机密度大的文件下找,如果存在该图片就使用,如果不存在,会往比手机密度小的图片所在drawable查找是否存在该图片,优先级是先大后小,因为在大目录下的密度会进行缩小,所占内存也会变小,在小目录下所占内存会放大