Android开发三种第三方图片加载的框架

时间:2022-04-14 08:19:22

最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录。

现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧。

一、Picasso

   1,首先在项目中引入picasso(以gradle为例),也就是app的build.gradle

    

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

   2,加载图片,通过源码可以发现load方法主要要以下几种重载

    load(Uri uri)  

    load(String path)

    load(File file)

    load(int resourceId)

 最常使用的应该就是网络加载图片,网络请求完数据之后存到List数组中

 Picasso.with(AppApplication.getmContext())//上下文
.load(list.get(i).getPath_vertical_s())//加载的地址
.resize(94, 131)//设置显示的图片大小
.placeholder(R.mipmap.ic_launcher)//图片较大加载慢时显示的图片
.error(R.mipmap.birth)//加载错误时的图片
.into(holder.iv_movie_abouttoshow_moviephoto);//指定显示图片的控件

Picasso的缓存机制:

Picasso的缓存流程是先检查内存是否有保存该图片,如果没有则检查磁盘是否有保存该图片,如果没有则从网络下载,下载成功之后分别保存到内存和磁盘上各一份,如果我们有时候不想缓存该图片或者不想从缓存获取图片,该如何呢?Picasso也给我买提供了相应的控制方法。

.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

代码含义:该方法表示跳过从磁盘加载图片,并且图片下载之后也不在磁盘中进行缓存。

参数介绍:

    MemoryPolicy.NO_CACHE:直接跳过检查内存是否有缓存该图片

    MemoryPolicy.NO_STORE:图片下载之后不在内存中进行缓存

这里注意只是不在磁盘中缓存,但是会在内存中缓存,因此若内存和磁盘中都不想缓存则需要和 两个方法共同使用,如下:

.networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)

.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

NetworkPolicy枚举中还有一个值OFFLINE,这个表示强制从缓存中取,不会发起网络请求,如 果缓存中没有也不会从网络中请求

3、问题

使用Picasso时(另外两个框架也一样),记得有一次使用的死数据,图片地址批量复制的,复制的时候多操作了一个空格,结果就一直没显示,这也是个坑填一下。

二、Glide

Glide和Picasso其实挺相似的,不管是从使用方法还是从出身

1,还是和Picasso一样添加依赖

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

2,加载图片

 //1.网络加载图片到ImageView中,注意这里的大小设置方法和Picasso是有区别的
Glide.with(context).load(imageUrl).override(94,131).into(imageView); //2.当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法
Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView); //3.当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:
Glide.with(context).load(imageUrl).error(R.mipmap.ic_launcher).into(imageView); //4.显示gif动画,asGif()判断是否是gif动画
Glide.with(context).load(imageUrl).asGif().into(imageView); //5.显示本地视频
String filePath = "/storage/emulated/0/demo/***.mp4";
Glide.with( context ).load( Uri.fromFile( new File( filePath ) ) ).into(video ); //6.缓存策略
Glide.with( context ).load(imageUrl).skipMemoryCache(true).into(imageViewInternet );//跳过内存缓存
Glide.with( context ).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into( imageViewInternet );//跳过硬盘缓存

三、Fresco

Fresco使用和其他两个有些区别,因为这里要使用的不是ImageView了而是他自己的图片显示控件

代码上:

<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_movie_abouttoshow_moviephoto"
android:layout_width="93dp"
android:layout_height="121dp"
app:placeholderImage="@mipmap/ic_launcher" />

//其他的属性设置

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" //边框颜色

如果你多次用了Fresco,建议在 Application 初始化,如果只是写着玩,就在应用调用 setContentView() 之前,进行初始化:

AppApplication
 Fresco.initialize(mContext);

加载图片

 Uri uri =  Uri.parse(list.get(i).getPath_vertical_s());
sdv.setImageURI(uri)
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.build();
sdv.setController(controller);

以上就是三种框架的使用方法,此随笔当作学习笔记记录一下。