Android網絡圖片加載~~~ ImageLoader+Picasso+Fresco

1、Universal-Image-Loader

特點

1)支持本地圖片和網絡圖片的多線程異步加載和緩存處理

2)個性化的配置自己項目ImageLoader

3)支持圖片下載過程的監聽回調

4)根據控件的大小對bitmap進行裁剪,減少佔用過多的內存

5)較好的控制圖片的加載過程,重新加載、暫停加載等


具體使用

A 添加庫文件

build.gradle中添加

  1. compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'


B 添加權限:

① 網絡 ②讀SD卡 ③寫SD卡


C application中配置屬性

ImageLoaderConfiguration

DisplayImageOptions 中推薦使用bitmapConfig(Bitmap.Config.RGB_565) 有利於加載圖片時候省內存


  1. private void initUniversalImageLoader(){
  2. //init image loader
  3. DisplayImageOptions options = new DisplayImageOptions.Builder()
  4. .showImageOnLoading(R.drawable.pic_loading_small)
  5. .showImageForEmptyUri(R.drawable.pic_loading_small)
  6. .showImageOnFail(R.drawable.pic_loading_small)
  7. .cacheInMemory(true)
  8. .cacheOnDisk(true)
  9. .considerExifParams(true)
  10. .imageScaleType(ImageScaleType.EXACTLY)
  11. .bitmapConfig(Bitmap.Config.RGB_565)//推薦使用這個
  12. .displayer(new SimpleBitmapDisplayer()).build();
  13. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
  14. .threadPoolSize(4)
  15. .threadPriority(Thread.NORM_PRIORITY - 2)
  16. .denyCacheImageMultipleSizesInMemory()
  17. .memoryCache(new UsingFreqLimitedMemoryCache(1 * 1024 * 1024))
  18. .memoryCacheSize(1 * 1024 * 1024)
  19. .diskCacheSize(50 * 1024 * 1024)
  20. // .diskCache(new UnlimitedDiscCache(getCacheDir(),new Md5FileNameGenerator()))//將保存的時候的URI名稱用MD5 加密
  21. .tasksProcessingOrder(QueueProcessingType.LIFO)
  22. .diskCacheFileCount(600)
  23. .defaultDisplayImageOptions(options)
  24. .build();
  25. ImageLoader.getInstance().init(config);
  26. }

D 使用

本地文件 file:// 目錄文件 drawable:// content://.../XX.jpg    assets://yyy.jpg

通過網絡加載的 http://....


基本使用

  1. ImageView imageView = (ImageView) findViewById(R.id.main_iv);
  2. ImageLoader imageLoader = ImageLoader.getInstance();
  3. imageLoader.displayImage("drawable://ic_launcher.png", imageView, new ImageLoadingListener() {
  4. //加載開始
  5. @Override
  6. public void onLoadingStarted(String imageUri, View view) {
  7. }
  8. //加載失敗
  9. @Override
  10. public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
  11. }
  12. //加載完成
  13. @Override
  14. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  15. }
  16. //加載取消
  17. @Override
  18. public void onLoadingCancelled(String imageUri, View view) {
  19. }
  20. });
  21. }
  1. DisplayImageOptions options = new DisplayImageOptions.Builder()
  2. .showImageOnLoading(R.drawable.ic_launcher)
  3. .showImageForEmptyUri(R.drawable.ic_launcher)
  4. .showImageOnFail(R.drawable.ic_launcher)
  5. .cacheInMemory(true)
  6. .cacheOnDisk(true)
  7. .considerExifParams(true)
  8. .imageScaleType(ImageScaleType.EXACTLY)
  9. .bitmapConfig(Bitmap.Config.RGB_565)//推薦使用這個
  10. .displayer(new SimpleBitmapDisplayer()).build();
  11. imageLoader.displayImage("圖片地址",imageView,options,null);
  1. ImageSize imageSize = new ImageSize(800, 800);
  2. imageLoader.loadImage("圖片地址", imageSize, new ImageLoadingListener() {
  3. @Override
  4. public void onLoadingStarted(String imageUri, View view) {
  5. }
  6. @Override
  7. public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
  8. }
  9. @Override
  10. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  11. //需要手動設置加載後的圖片到控件上
  12. imageView.setImageBitmap(loadedImage);
  13. }
  14. @Override
  15. public void onLoadingCancelled(String imageUri, View view) {
  16. }
  17. });
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)可以適應佈局大小並減少內存佔用。


使用


引用庫:

  1. compile 'com.squareup.picasso:picasso:2.5.2'

  1. //加載本地圖片
  2. Picasso.with(this).load(R.drawable.ic_launcher).into(imageView);
  3. //加載手機中的圖片
  4. Picasso.with(this).load(new File("/storage/0/....")).into(imageView);
  5. Picasso.with(this).load("file://android_assets/ic_launcher.png").into(imageView);
  6. //加載網絡圖片
  7. Picasso.with(this).load("網絡圖片鏈接").into(imageView);
  1. //裁剪大小
  2. Picasso.with(this).load("網絡圖片鏈接").resize(dp2dx(this, 200f), dp2dx(this, 200f)).into(imageView);
  3. private int dp2dx(Context context, float dp) {
  4. float density = context.getResources().getDisplayMetrics().density;
  5. return (int) (dp * density + 0.5f);
  6. }
  1. Picasso.with(this).load("網絡圖片鏈接")
  2. .placeholder(R.drawable.ic_launcher)//正在加載時 展示的圖片
  3. .error(R.drawable.ic_launcher)//加載失敗時候的圖片
  4. .into(imageView);


3、Fresco


由Facebook 在 2015年推出的一款開源框架。

特點

完善的內存緩存和釋放機制
漸進式圖片加載
動圖支持
可以高度自定義的UI
可以高度自定義的圖片加載過程


使用


引用庫:
  1. compile 'com.facebook.fresco:fresco:1.5.0'
佈局中對屬性的設置:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:fresco="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <com.facebook.drawee.view.SimpleDraweeView
  7. android:id="@+id/main_iv_fresco"
  8. android:layout_width="100dp"
  9. android:layout_height="100dp"
  10. android:layout_centerInParent="true"
  11. fresco:actualImageScaleType="focusCrop"//圖片的縮放類型
  12. fresco:backgroundImage="@drawable/ic_launcher"//背景圖片
  13. fresco:fadeDuration="5000"//淡入淺出的時間
  14. fresco:failureImage="@drawable/ic_launcher"//失敗時候的圖片
  15. fresco:failureImageScaleType="focusCrop"//失敗圖片的縮放類型
  16. fresco:placeholderImage="@drawable/ic_launcher"//正在加載中的圖片
  17. fresco:placeholderImageScaleType="focusCrop"//正在加載時候的圖片縮放類型
  18. fresco:progressBarAutoRotateInterval="5000"//進度條的旋轉週期
  19. fresco:progressBarImage="@drawable/ic_launcher"//進度條圖片
  20. fresco:progressBarImageScaleType="center"//進度條的縮放類型
  21. fresco:retryImage="@drawable/ic_launcher"//重新加載的圖片
  22. fresco:retryImageScaleType="focusCrop"//重新加載的圖片縮放類型
  23. fresco:roundAsCircle="true"//是否是圓形
  24. fresco:roundBottomLeft="true"//左上右下的位置是否是圓形
  25. fresco:roundBottomRight="true"
  26. fresco:roundTopLeft="true"
  27. fresco:roundTopRight="true"
  28. fresco:roundedCornerRadius="10dp"//半徑
  29. fresco:roundingBorderColor="@color/colorAccent"//填充線條的顏色
  30. fresco:roundingBorderPadding="10dp" />//填充的線條寬度
  31. </RelativeLayout>

初始化

需要放在setContentView()前面
  1. Fresco.initialize(this);

加載圖片

  1. imageView = (SimpleDraweeView) findViewById(R.id.main_iv_fresco);
  2. //加載圖片
  3. Uri uri = Uri.parse("http://dynamic-image.yesky.com/740x-/uploadImages/2015/163/50/690V3VHW0P77.jpg");
  4. imageView.setImageURI(uri);
  5. //圖片加載失敗時候可以點擊重試
  6. DraweeController controller = Fresco.newDraweeControllerBuilder()
  7. .setUri(uri)
  8. .setTapToRetryEnabled(true)
  9. .setOldController(imageView.getController())
  10. .build();
  11. imageView.setController(controller);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章