最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录。
现在项目使用的是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);
以上就是三种框架的使用方法,此随笔当作学习笔记记录一下。