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);

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