Android图片加载框架(universal-image-loader,Picasso,Glide,Fresco)的用法

一、Universal-image-loader:它是一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。具体的特性如下:

  1. 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等;
  2. 包含各种各样的配置,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置;
  3. 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存;
  4. 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片;
  5. 提供在较慢的网络下对图片进行加载。

具体的用法:先添加依赖:

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

在application里面创建ImageLoader的配置参数,并初始化到ImageLoade:

 /** * 初始化Universal-Image-Loader */
    private void initImageLoader()
    {
        // 获取单例的ImageLoader对象
        imageLoader = ImageLoader.getInstance();

        // 定义内存缓存大小
        int cacheSize = (int) Runtime.getRuntime().maxMemory() / 8;

        // 定义ImageLoaderConfiguration
        ImageLoaderConfiguration configuration =
                new ImageLoaderConfiguration.Builder(this)
                        .threadPoolSize(3)//设置线程池个数
                        .threadPriority(Thread.NORM_PRIORITY - 2)  
                        .diskCache(new LimitedAgeDiskCache(new File("/mnt/sdcard/imagecache"), 60 * 60 * 1000))//设置磁盘缓存缓存,LimitedAgeDiskCache限制了缓存对象最长存活周期的磁盘缓存, 内部管理一个HashMap<File, Long>, save()时存储当前时间作为对象的创建时间,get()时判断如果当前缓存对象存活时间已经超过设置的最长时间,则删除。
                        .diskCacheSize(50 * 1024 * 1024)//设置磁盘缓存大小
                        .diskCacheFileCount(1000)//设置磁盘缓存文件个数
                        .memoryCache(new LimitedAgeMemoryCache(new LruMemoryCache(cacheSize), 60 * 60 * 1000))//设置内存缓存
                        .build();

        // 初始化配置
        ImageLoader.getInstance().init(configuration);
        options = new DisplayImageOptions.Builder()
                .delayBeforeLoading(1000)//设置延时多少时间后开始下载
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)// 是否考虑JPEG图像EXIF参数(旋转,翻转)
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)//设置图片以何种编码方式显示
                 .bitmapConfig(Bitmap.Config.RGB_565) // 设置图片的解码类型
                .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
                .displayer(new FadeInBitmapDisplayer(1000))//是否图片加载好后渐入的动画时间
                .showImageOnLoading(R.mipmap.ic_launcher)//设置正在加载时的图片
                .showImageOnFail(R.mipmap.ic_launcher)//设置加载失败时的图片
                .showImageForEmptyUri(R.mipmap.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片
                .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位 
                .build();
    }
     /** * 获取ImageLoader对象 * * @return */
    public ImageLoader getImageLoader()
    {
        return this.imageLoader;
    }

    public DisplayImageOptions getImageOptions()
    {
        return options;
    }
    /** * 获取应用程序对象 * * @return */
    public static BaseApplication getApplication()
    {
        return application;
    }

在我们使用的时候,可以按如下方式:

 private DisplayImageOptions options = options = BaseApplication.getApplication().getImageOptions();//获取在application里面的DisplayImageOptions 

BaseApplication.getApplication().getImageLoader().displayImage(url,imageView,options);//获取ImageLoader并将图片设置进imageView里面

当然对于不同的场景可以设置不同的DisplayImageOptions ,也可以在使用的时候配置不同的options 。
补充对于上面的配置:
1).imageScaleType(ImageScaleType imageScaleType) 是设置 图片的缩放方式
缩放类型mageScaleType:

          EXACTLY :图像将完全按比例缩小的目标大小

          EXACTLY_STRETCHED:图片会缩放到目标大小完全

          IN_SAMPLE_INT:图像将被二次采样的整数倍

          IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小

          NONE:图片不会调整

2).displayer(BitmapDisplayer displayer) 是设置 图片的显示方式

  显示方式displayer:

          RoundedBitmapDisplayer(int roundPixels)设置圆角图片

          FakeBitmapDisplayer()这个类什么都没做

          FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间

          SimpleBitmapDisplayer()正常显示一张图片  

对于ListView,GridView中,滑动过程中暂停加载图片设置:

listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling)); 

二、Picasso:Square开发的,和OkHttp搭配起来更配。
Picasso的特性:
- 在adapter中回收和取消当前的下载;
- 使用最少的内存完成复杂的图形转换操作;
- 自动的内存和硬盘缓存;
- 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
- 加载载网络或本地资源;
Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
1.在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
2.使用复杂的图片压缩转换来尽可能的减少内存消耗。
3.自带内存和硬盘二级缓存功能。
Picasso的用法比较简单:一行代码就可以解决 :

Picasso.with(context).load(url).into(imageView);

在网上看到说Picasso可以自动检测适配器复用

@Override
public void getView(int position, View convertView, ViewGroup parent) {  
  SquaredImageView view = (SquaredImageView) convertView;    
  if (view == null) {  
     view = new SquaredImageView(context);  
  }  
  String url = getItem(position);  
  Picasso.with(context).load(url).into(view);   
}  

我对这个SquaredImageView 不是很理解也不是很明白这个是什么意思,希望知道的朋友可以为我解答。
Picasso在图片加载的时候对图片进行一些处理:

Picasso.with(context)
  .load(url)
  .resize(200, 200) //重置图片的大小,设置图片显示的像素。
  .config(Bitmap.Config.RGB_565)//设置Bitmap的Config属性
  .centerCrop() //设置ImageView的ScaleType属性
  .placeholder(R.mipmap.ic_launcher) //设置加载等待图片
  .error(R.mipmap.ic_launcher) //设置加载错误图片
  .into(imageView);

还有以下操作:
noPlaceholder():设置没有加载等待图片

tag(Object tag):设置标记

fit():自适应,下载的图片有多少像素就显示多少像素

resizeDimen(int targetWidthResId, int targetHeightResId):设置图片显示的像素。

centerInside():设置ImageView的ScaleType属性.

rotate(float degrees):设置旋转角度。

rotate(float degrees, float pivotX, float pivotY):设置以某个中心点设置某个旋转角度。

priority(Priority priority):设置请求的优先级。

transform(Transformation transformation):

skipMemoryCache():跳过内存缓存

memoryPolicy(MemoryPolicy policy, MemoryPolicy… additional):放弃memory cache(使用:.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)memoryPolicy的NO_CACHE是指图片加载时放弃在内存缓存中查找,NO_STORE是指图片加载完不缓存在内存中。

networkPolicy(NetworkPolicy policy, NetworkPolicy… additional):加载网络图片,并设置不使用内存缓存中查找也不存储内存缓存

noFade():没有淡入淡出效果

get():获得bitmap对象

三、Glide:Google推荐的图片加载库,专注于流畅的滚动。特点:
(1)使用简单
(2)可配置度高,自适应程度高
(3)支持常见图片格式 Jpg png gif webp
(4)支持多种数据源 网络、本地、资源、Assets 等
(5)高效缓存策略 支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
(6)生命周期集成 根据Activity/Fragment生命周期自动管理请求
(7)高效处理Bitmap 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力
用法:添加依赖:

compile 'com.github.bumptech.glide:glide:3.7.0

Glide的使用还要依赖support-v4,因此没有添加v4包的要添加v4依赖:

compile 'com.android.support:support-v4:23.3.0'

详细用法:

 Glide.with(this) 
      .load(url)
      .asGif()//表示的gif动画
      .override(300,300)//设置显示图片的width,height
      .diskCacheStrategy(DiskCacheStrategy.SOURCE)//磁盘缓存策略
      .placeholder(R.drawable.progressbar)//设置图片加载时的占位图
      .thumbnail(1f)//设置缩略图显示传入值(0-1f)
      .error(R.drawable.error)//设置加载错误的图片
      .priority(Priority.HIGH)//当前线程的优先级
      .into(mImageView);

还有一些操作:
.asBitmap():无论资源是不是gif动画,都作为Bitmap对待。如果是gif动画会停在第一帧。
.crossFade():显示图片时执行淡入淡出的动画
.dontAnimate():不执行显示图片时的动画
.animate():设置显示的动画
.transform(): 图片圆角或圆形显示(继承 BitmapTransformation可行)
.listener():异常监听
.bitmapTransform():bitmap转换, 比如:旋转,方法,缩小,高斯模糊等等(当用了转换后你就不能使用 .centerCrop() 或 .fitCenter() 了。)
下面推荐一篇文章,里面有Glide使用中存在的一些问题和解决方案。http://www.wtoutiao.com/p/y3eaF0.html

四、Fresco:是 Facebook 出品,特点:
1)内存管理
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
内存分配采用:系统匿名共享内存
2)渐进式呈现图片
渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续, 呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
3)支持加载Gif图,支持WebP格式。
4)图像的呈现
(1)自定义居中焦点(对人脸等图片显示非常有帮助)。
(2)圆角图,当然圆圈也行。
(3)下载失败之后,点击重新下载。
(4)自定义占位图,自定义overlay, 或者进度条。
(5)指定用户按压时的overlay。
5)图像的加载
(1)为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。
(2)先显示一个低解析度的图片,等高清图下载完之后再显示高清图。
(3)加载完成回调通知。
(4)对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图。
(5)缩放或者旋转图片。
(6)处理已下载的图片。
使用:先添加依赖

 compile 'com.facebook.fresco:fresco:0.14.1'

在xml文件里面:记得添加fresco的自定义属性

<LinearLayout 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"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sdv"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        fresco:actualImageScaleType="focusCrop"
        fresco:fadeDuration="300"
        fresco:failureImage="@mipmap/ic_launcher"
        fresco:failureImageScaleType="centerInside"
        fresco:placeholderImage="@mipmap/ic_launcher"
        fresco:placeholderImageScaleType="fitCenter"
        fresco:roundAsCircle="true" />
</LinearLayout>

在Activity里面:

public class ThreeActivity extends AppCompatActivity {
    private SimpleDraweeView mSimpleDraweeView;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化在需要在setContentView之前或者在application的onCreate()里面
        Fresco.initialize(this);
        setContentView(R.layout.acticity_three);
        mSimpleDraweeView = (SimpleDraweeView) findViewById(R.id.sdv);
        Uri uri = Uri.parse("http://dynamic-image.yesky.com/740x-/uploadImages/2015/163/50/690V3VHW0P77.jpg");
// mSimpleDraweeView.setImageURI(uri);
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(uri)
                .setAutoPlayAnimations(true)
                .build();
        mSimpleDraweeView.setController(controller);
    }
}

Fresco采用的SimpleDraweeView.setImageURI()和SimpleDraweeView.setController()两种方式加载图片。并且Frescoo 不支持相对路径的URI. 所有的URI都必须是绝对路径。
下面还有一些Fresco的属性:

fresco:fadeDuration="300" // 淡入淡出的持续时间
fresco:actualImageScaleType="focusCrop"  // 实际图像的缩放类型
fresco:placeholderImage="@color/wait_color"  //占位图
fresco:placeholderImageScaleType="fitCenter" //占位图的缩放类型
fresco:failureImage="@drawable/error" //下载失败显示的图片
fresco:failureImageScaleType="centerInside" //失败图的缩放类型
fresco:retryImage="@drawable/retrying"
//图片加载失败时显示,提示用户点击重新加载,重复加载4次还是没有加载出来的时候才会显示failureImage的图片
fresco:retryImageScaleType="centerCrop" //重新加载的图片缩放类型
fresco:progressBarImage="@drawable/progress_bar" //进度条图片
fresco:progressBarImageScaleType="centerInside"//精度条图片缩放类型
fresco:progressBarAutoRotateInterval="1000"//进度图自动旋转间隔时间(单位:毫秒ms)
fresco:backgroundImage="@color/blue"//背景图片,这里的背景图片首先被绘制
fresco:overlayImage="@drawable/watermark"// 设置叠加图,在xml中只能设置一张叠加图片,如果需要多张图片的话,需要在java代码中设置哦
fresco:pressedStateOverlayImage="@color/red"// 设置点击状态下的叠加图
fresco:roundAsCircle="false" //设置为圆形图
fresco:roundedCornerRadius="1dp" // 圆角半径
fresco:roundTopLeft="true" // 左上角是否为圆角
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:roundWithOverlayColor="@color/corner_color"//圆角覆盖物颜色
fresco:roundingBorderWidth="2dp" //边框的宽度
fresco:roundingBorderColor="@color/border_color" //边框颜色

说明:必须声明 android:layout_width 和 android:layout_height,否则将无法正确加载图像,另外不支持 wrap_content 属性。
对于Fresco的使用我参考了一下这篇文章http://www.cnblogs.com/liushilin/p/5659301.html。
上述的这些都是简单的使用,更加深层次的还需要大家深入研究。

你可能感兴趣的:(框架,图片,Glide,Picasso,Fresco)