1、Universal-Image-Loader
特點
1)支持本地圖片和網絡圖片的多線程異步加載和緩存處理
2)個性化的配置自己項目ImageLoader
3)支持圖片下載過程的監聽回調
4)根據控件的大小對bitmap進行裁剪,減少佔用過多的內存
5)較好的控制圖片的加載過程,重新加載、暫停加載等
具體使用
A 添加庫文件
build.gradle中添加
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
B 添加權限:
① 網絡 ②讀SD卡 ③寫SD卡
C application中配置屬性
ImageLoaderConfiguration
DisplayImageOptions 中推薦使用bitmapConfig(Bitmap.Config.RGB_565) 有利於加載圖片時候省內存
private void initUniversalImageLoader(){
//init image loader
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.pic_loading_small)
.showImageForEmptyUri(R.drawable.pic_loading_small)
.showImageOnFail(R.drawable.pic_loading_small)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)//推薦使用這個
.displayer(new SimpleBitmapDisplayer()).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
.threadPoolSize(4)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new UsingFreqLimitedMemoryCache(1 * 1024 * 1024))
.memoryCacheSize(1 * 1024 * 1024)
.diskCacheSize(50 * 1024 * 1024)
// .diskCache(new UnlimitedDiscCache(getCacheDir(),new Md5FileNameGenerator()))//將保存的時候的URI名稱用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.diskCacheFileCount(600)
.defaultDisplayImageOptions(options)
.build();
ImageLoader.getInstance().init(config);
}
D 使用
本地文件 file:// 目錄文件 drawable:// content://.../XX.jpg assets://yyy.jpg
通過網絡加載的 http://....
基本使用
ImageView imageView = (ImageView) findViewById(R.id.main_iv);
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage("drawable://ic_launcher.png", imageView, new ImageLoadingListener() {
//加載開始
@Override
public void onLoadingStarted(String imageUri, View view) {
}
//加載失敗
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
//加載完成
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
//加載取消
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)
.showImageForEmptyUri(R.drawable.ic_launcher)
.showImageOnFail(R.drawable.ic_launcher)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)//推薦使用這個
.displayer(new SimpleBitmapDisplayer()).build();
imageLoader.displayImage("圖片地址",imageView,options,null);
ImageSize imageSize = new ImageSize(800, 800);
imageLoader.loadImage("圖片地址", imageSize, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//需要手動設置加載後的圖片到控件上
imageView.setImageBitmap(loadedImage);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
displayImage使用的是弱引用,方便垃圾回收。推薦使用這個方法。
防止OOM
1) threadPoolSize 儘量設置在1~5之間;
2) 配置解碼的方式設置爲RGB_565(默認888);
3) displayImage方法推薦使用。
2、Picasso
Square公司開源的一個android圖形緩存庫,實現圖片下載和緩存功能
特點
1)加載網絡或本地圖片並自動緩存處理
Picasso.with(content).load(imageUrl).into(imageView);
2) 圖片轉換操作,變換大小 旋轉等,提供接口可以自定義動作;
3) 在adapter中回收和取消當前下載功能;
4)可以適應佈局大小並減少內存佔用。
使用
引用庫:
compile 'com.squareup.picasso:picasso:2.5.2'
//加載本地圖片
Picasso.with(this).load(R.drawable.ic_launcher).into(imageView);
//加載手機中的圖片
Picasso.with(this).load(new File("/storage/0/....")).into(imageView);
Picasso.with(this).load("file://android_assets/ic_launcher.png").into(imageView);
//加載網絡圖片
Picasso.with(this).load("網絡圖片鏈接").into(imageView);
//裁剪大小
Picasso.with(this).load("網絡圖片鏈接").resize(dp2dx(this, 200f), dp2dx(this, 200f)).into(imageView);
private int dp2dx(Context context, float dp) {
float density = context.getResources().getDisplayMetrics().density;
return (int) (dp * density + 0.5f);
}
Picasso.with(this).load("網絡圖片鏈接")
.placeholder(R.drawable.ic_launcher)//正在加載時 展示的圖片
.error(R.drawable.ic_launcher)//加載失敗時候的圖片
.into(imageView);
3、Fresco
由Facebook 在 2015年推出的一款開源框架。
特點
完善的內存緩存和釋放機制
漸進式圖片加載
動圖支持
可以高度自定義的UI
可以高度自定義的圖片加載過程
使用
引用庫:
compile 'com.facebook.fresco:fresco:1.5.0'
佈局中對屬性的設置:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/main_iv_fresco"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
fresco:actualImageScaleType="focusCrop"//圖片的縮放類型
fresco:backgroundImage="@drawable/ic_launcher"//背景圖片
fresco:fadeDuration="5000"//淡入淺出的時間
fresco:failureImage="@drawable/ic_launcher"//失敗時候的圖片
fresco:failureImageScaleType="focusCrop"//失敗圖片的縮放類型
fresco:placeholderImage="@drawable/ic_launcher"//正在加載中的圖片
fresco:placeholderImageScaleType="focusCrop"//正在加載時候的圖片縮放類型
fresco:progressBarAutoRotateInterval="5000"//進度條的旋轉週期
fresco:progressBarImage="@drawable/ic_launcher"//進度條圖片
fresco:progressBarImageScaleType="center"//進度條的縮放類型
fresco:retryImage="@drawable/ic_launcher"//重新加載的圖片
fresco:retryImageScaleType="focusCrop"//重新加載的圖片縮放類型
fresco:roundAsCircle="true"//是否是圓形
fresco:roundBottomLeft="true"//左上右下的位置是否是圓形
fresco:roundBottomRight="true"
fresco:roundTopLeft="true"
fresco:roundTopRight="true"
fresco:roundedCornerRadius="10dp"//半徑
fresco:roundingBorderColor="@color/colorAccent"//填充線條的顏色
fresco:roundingBorderPadding="10dp" />//填充的線條寬度
</RelativeLayout>
初始化
需要放在setContentView()前面
Fresco.initialize(this);
加載圖片
imageView = (SimpleDraweeView) findViewById(R.id.main_iv_fresco);
//加載圖片
Uri uri = Uri.parse("http://dynamic-image.yesky.com/740x-/uploadImages/2015/163/50/690V3VHW0P77.jpg");
imageView.setImageURI(uri);
//圖片加載失敗時候可以點擊重試
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setTapToRetryEnabled(true)
.setOldController(imageView.getController())
.build();
imageView.setController(controller);