这两天看了一下官方关于图片加载的东西,记录一下
大图加载
有时候图片加载没必要加载原图那么大的解析度,就像系统相册展示照片时,系统照相机拍出来的照片解析度远远高于屏幕能够解析的阈值,就像拿一张4k的图片到1080p的显示屏上展示,最大只能到1080p。所以原图加载:
所以展示图片的大小根据UI组件来确定。很多时候就需要加载一张小一点的图片了。
读取Bitmap的大小和类型【具体代码后面会有】
BitmapFactory提供了解析多种源的方法,如名字说明的一样[decodeByteArray()](https://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeByteArray(byte[], int, int, android.graphics.BitmapFactory.Options)), [decodeFile()](https://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String, android.graphics.BitmapFactory.Options)), [decodeResource()](https://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory.Options))。这个方法会为图片分配内存,但是有个BitmapFactory.Options,可以为解析设置一些可变属性。 inJustDecodeBounds这个方法设置为true后,就不会分配内存,仅仅解析一些图片的基本属性。然后上面那个三个解析的属性会返回Null,以下加载的是一张19201080,24bit color,404.94k*的图片,机型为红米2A,原图加载一张图片就占用了这么多内存,
加载缩略过的图片
这里要设置inSampleSize为ture,,我的理解这个就是缩小比例,下面是计算方法,
下图是调用上面那个方法来获取inSampleSize
下图是上图打印的值,原来的大小和实际加载到内存中的大小(其实这个大小根据手机还会不一样,跟屏幕的dpi有关,如果不设置inSampleSize,读取加载到内存中的
option.outheight
和option.outwidth
会比1920*1080大的多,并且不同手机还不一样,我的想法是因为我的图片放到了drawble下,如果放到不同大小的bitmap下是不是同一台手机都会不一样,因为系统会根据这个文件夹来缩放原图。所以造成了实际加载的比原图大,如果放到xxxhdpi下,那系统又会不会给我们缩小?试了的同学评论告诉一声,哈哈)我设置需求是5050,注意是按比例,并不是一定会缩到50*50
可以看到已经大大的缩小了,再看看内存占用(5050太小了,不明显,这里改成了400*400):
不要在UI线程加载图片
一般图片加载都是从本地磁盘或者网络加载,如果在UI线程执行这些操作,稍出意外直接ANR。