這兩天看了一下官方關(guān)于圖片加載的東西,記錄一下
大圖加載
有時(shí)候圖片加載沒必要加載原圖那么大的解析度吭露,就像系統(tǒng)相冊(cè)展示照片時(shí)耀找,系統(tǒng)照相機(jī)拍出來的照片解析度遠(yuǎn)遠(yuǎn)高于屏幕能夠解析的閾值怜械,就像拿一張4k的圖片到1080p的顯示屏上展示灾而,最大只能到1080p饭寺。所以原圖加載:
所以展示圖片的大小根據(jù)UI組件來確定阻课。很多時(shí)候就需要加載一張小一點(diǎn)的圖片了。
讀取Bitmap的大小和類型【具體代碼后面會(huì)有】
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))限煞。這個(gè)方法會(huì)為圖片分配內(nèi)存,但是有個(gè)BitmapFactory.Options员凝,可以為解析設(shè)置一些可變屬性署驻。 inJustDecodeBounds這個(gè)方法設(shè)置為true后,就不會(huì)分配內(nèi)存健霹,僅僅解析一些圖片的基本屬性旺上。然后上面那個(gè)三個(gè)解析的屬性會(huì)返回Null,以下加載的是一張19201080,24bit color,404.94k*的圖片骤公,機(jī)型為紅米2A抚官,原圖加載一張圖片就占用了這么多內(nèi)存,
加載縮略過的圖片
這里要設(shè)置inSampleSize為ture,阶捆,我的理解這個(gè)就是縮小比例凌节,下面是計(jì)算方法钦听,
下圖是調(diào)用上面那個(gè)方法來獲取inSampleSize
下圖是上圖打印的值,原來的大小和實(shí)際加載到內(nèi)存中的大小(其實(shí)這個(gè)大小根據(jù)手機(jī)還會(huì)不一樣倍奢,跟屏幕的dpi有關(guān)朴上,如果不設(shè)置inSampleSize,讀取加載到內(nèi)存中的
option.outheight
和option.outwidth
會(huì)比1920*1080大的多卒煞,并且不同手機(jī)還不一樣痪宰,我的想法是因?yàn)槲业膱D片放到了drawble下,如果放到不同大小的bitmap下是不是同一臺(tái)手機(jī)都會(huì)不一樣畔裕,因?yàn)橄到y(tǒng)會(huì)根據(jù)這個(gè)文件夾來縮放原圖衣撬。所以造成了實(shí)際加載的比原圖大,如果放到xxxhdpi下扮饶,那系統(tǒng)又會(huì)不會(huì)給我們縮芯吡贰?試了的同學(xué)評(píng)論告訴一聲甜无,哈哈)我設(shè)置需求是5050,注意是按比例扛点,并不是一定會(huì)縮到50*50
可以看到已經(jīng)大大的縮小了,再看看內(nèi)存占用(5050太小了岂丘,不明顯陵究,這里改成了400*400):
不要在UI線程加載圖片
一般圖片加載都是從本地磁盤或者網(wǎng)絡(luò)加載,如果在UI線程執(zhí)行這些操作奥帘,稍出意外直接ANR铜邮。