Bitmap加載和Cache
- BitmapOptions
decodeFile
decodeStream
decodeResource
decodeByteArray
- BitmapFactory.Options
inSampleSize:采用率
為1時:采樣后的圖片和原圖沒區(qū)別
大于1:比如等于2時贾惦,采樣后的圖片寬高為原來的1/2,像素為原圖的1/4敦捧,占用的內存大小也為原圖的1/4
一張10241024的argb8888格式圖片须板,每個像素大小是4bit(1bit8位,四個8就4bit)兢卵,總大小為102410244=4MB,采用insamplesize為2后习瑰,總大小為512512*4=1MB
所以insampleSize大于1時才會有采樣縮放
inSampleSize同時作用于寬高,寬高大小隨采樣率的2次方遞減秽荤,1/采樣率^2
inSampleSize小于1時值等于1來處理甜奄。
官方建議按照2的指數來設置inSampleSize,如1,2,4,16...
/*圖片壓縮采樣*/
public Bitmap decodeSampledBitmapFromResource(Resources res, @IdRes int id, int reqWidth, int reqHeight) {
final BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, id, opts);
int outWidth = opts.outWidth;
int outHeight = opts.outHeight;
int inSampleSize = calculateInSampleSize(outWidth, outHeight, reqWidth, reqHeight);
opts.inJustDecodeBounds = false;
opts.inSampleSize = inSampleSize;
return BitmapFactory.decodeResource(res, id, opts);
}
private int calculateInSampleSize(int outWidth, int outHeight, int reqWidth, int reqHeight) {
if (reqHeight == 0 || reqWidth == 0) {
return 1;
}
int inSampleSize = 1;
if (outWidth > reqWidth || outHeight > reqHeight) {
int w = outWidth / 2;
int h = outHeight / 2;
while ((w / inSampleSize) >= reqWidth && (h / inSampleSize) >= reqHeight) {
inSampleSize *= 2;
}
}
Log.d(TAG, "inSampleSize:" + inSampleSize);
return inSampleSize;
}
- LruCache 內存緩存
- DisLruCache 存儲設備緩存
-
LruCache
LruCache是一個泛型類王滤,內部維護一個LinkedHashMap,以強引用的方式存儲外界的對象,提供了get,put方法來完成緩存對象的獲取和添加滓鸠,當緩存滿時雁乡,會移除較早使用的對象并添加新對象。
-
DiskLruCache
SDK源碼中沒有糜俗,需要去安卓開發(fā)者網站上下載
1. 創(chuàng)建:
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
throws IOException {}
第四個參數maxSize表示總大小踱稍。當超過指定的總大小后曲饱,會通過lru算法刪除某些內容。
2. 添加元素
通過edit()的Editor對象珠月,如果這個緩存正在被編輯扩淀,edit()會返回null,建議對key進行MD5話,避免特殊字符的麻煩啤挎。
通過Editor.newOutputStream()獲得輸出流
通過Editor.commit()提交寫入操作驻谆,通過Editor.abort()來回退整個操作,之后通過DiskLruCache.flush()刷新庆聘。
3. DiskLruCache緩存查找
通過get(key)方法胜臊,返回Snapshot對象,再通過Snapshot.getInputStream()獲取輸入流伙判,加載文件象对。
- 優(yōu)化列表卡頓
- getView中不做耗時操作
- 監(jiān)聽滾動事件,當滾動時不去加載圖片宴抚,僅僅當列表停止時加載勒魔。
- 開啟硬件加速:在Activity清單文件節(jié)點加上android:hardwareAccelerated="true"