-
使用InBitmap就可以讓三張圖片占用一個內(nèi)存,前提是后面兩個圖片占用內(nèi)存小于第一個
查看全部 -
從解碼率方面如何對圖片進(jìn)行優(yōu)化:RGB_565一個像素占兩個字節(jié),ARGB_8888一個像素占4個字節(jié),代碼實(shí)現(xiàn):options.inPreferredConfig設(shè)置
查看全部 -
優(yōu)化方式一
查看全部 -
png沒有壓縮,jpeg壓縮,webp是理想選擇
查看全部 -
如截圖所示
查看全部 -
與手機(jī)內(nèi)存沒有關(guān)系,超出系統(tǒng)給應(yīng)用的最大限制就會溢出
查看全部 -
見截圖所示
查看全部 -
54564554
查看全部 -
32222222222
查看全部 -
撒旦撒旦撒旦撒旦
查看全部 -
超大圖片
1.使用BitmapRegionDecoder.decodeRegion()來實(shí)現(xiàn)
public?Bitmap?decodeRegion(Rect?rect,?BitmapFactory.Options?options);
2.通常的做法是
(1)定義一個View來顯示這張圖,在onMeasure()中創(chuàng)建一個和View一樣大小的Rect,用來作為decodeRegion()的參數(shù)
int?width?=?getMeasuredWidth(); int?height?=?getMeasuredHeight();//View寬和高 int?imgWidth?=?mImgWidth; int?imgHeight?=?mImgHeight;?//圖片寬和高,?通過BitmapFactory.decodeFile(...,?options)可以拿到,當(dāng)然options.inJustDecodeBounds?=?true //獲取rect的左右上下邊界,?默認(rèn)是顯示圖片的中心區(qū)域 mRect.left?=?imgWidth/2?-?width/2; mRect.top?=?imgHeight/2?-?height/2; mRect.right?=?imgWidth/2?+?width/2; mRect.bottom?=?imgHeight/2?+?height/2;
(2)在自定義View的onDraw()方法中將decodeRegion()得到的bitmap進(jìn)行繪制到View上
(3)這個View還需要實(shí)現(xiàn)OnGestureListener接口,實(shí)現(xiàn)自己的move()函數(shù),其實(shí)主要是改變這個Rect。然后調(diào)用invalidate()從decodeRegion(rect, ...)中拿到新的bitmap(可能只是一個小區(qū)域),再進(jìn)行draw(bitmap, ...);
查看全部 -
1. mipmap
Android API17引入的一種提高bitmap渲染速度和質(zhì)量的技術(shù);如果mipmap目錄下有圖片,Android默認(rèn)會調(diào)用setHasMipMap()開啟。
一般情況下,啟動圖標(biāo)會放在mipmap目錄下。
2. Android圖片匹配規(guī)則
假如有個設(shè)置是480dpi,查找對應(yīng)的圖片文件的順序如下,直到找到為止
xxhdpi——>xxxhdpi——>nodpi(不會縮放)——>xhdpi——>hdpi
查看全部 -
圖片OOM問題
OOM是指Android系統(tǒng)允許進(jìn)程運(yùn)行時所使用的內(nèi)存,和手機(jī)本身系統(tǒng)沒有關(guān)系。
產(chǎn)生
(1)一個頁面一次加載過多圖片。雖然每個圖片的bitmap占用內(nèi)存較小,但是如果圖片過多也會oom
(2)加載大圖片沒有進(jìn)行壓縮
(3)類似ListView這種先后使用bitmap,但是先前的沒有進(jìn)行緩存。
2.解決
(1)尺寸壓縮:通過增大inSampleSize來壓縮
BitmapFactory.Options.inSampleSize
(2)質(zhì)量壓縮:減少圖片一個像素所占用的內(nèi)存大小
RGB_565一個像素點(diǎn)占用2個byte,ARGB_8888占用4個byte
Bitmap.Config.RGB_565
通常的例子如圖所示
(3)內(nèi)存重用:通常使用BitmapFactory.Options.inBitmap
BitmapFactory.Options?options?=?new?BitmapFactory.Options(); options.inBitmap?=?mBitmap;?//重用了mBitmap的內(nèi)存,注意當(dāng)前decode出來的bitmap內(nèi)存大小不能超過mBitmap Bitmap?bitmap?=?BitmapFactory.decodeFile(...,?options); //bitmap是新decode出來的。
查看全部 -
見截圖所示
查看全部 -
如截圖所示
查看全部
舉報