Android 图片框架
1、图片框架:Picasso、Glide、Fresco
2.介绍:
picasso:和Square的网络库能发挥最大作用,因为Picasso可以选择将网络请求的缓存部分交给了okhttp实现
Glide:模仿了Picasso的API,而且在他的基础上加了很多的扩展(比如git等支持)
Picasso能实现的功能,Glide都能实现,但Picasso体积比Glide小很多,如果项目中网络请求本身用的就是okhttp或者retrofit(本质还是okhttp),那么建议用Picasso,Glide的好处是大型的图片流,比如git、video等
Glide详解:
创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。
Glide特点:
- 使用简单
- 可配置度高,自适应程度高
- 支持常见图片格式jpg、png、gif、webp
- 支持多种资源 玩过、本地、资源、Assets等
- 高效缓存策略 支持Memory和Disk图片缓存,默认Bitmap格式采用RGB_565内存使用至少减少一半
- 生命周期集成 根据Activity/Fragment生命周期自动管理请求
- 高效处理Bitmap 使用Bitmap Pool使Bitmap复用,制动调用recycle回收需要回收的Bitmap,减小系统回收压力
Glide使用:
1、添加引用build.gradle中添加配置
compile 'com.github.bumptech.glide:glide:3.7.0'
2、设置绑定生命周期
Glide.with(Context context); //绑定Context Glide.with(Activity activity);//绑定Activity Glide.with(FragmentActivity activity);//绑定FragmentActivity Glide.with(Fragment fragment);//绑定Fragment
3、简单的加载图片实例
Glide.with(this).load(imgUrl).into(imageView);
4、设置加载中及加载失败图片
api里面对placeholder(),error()函数中有多态实现
Glide.with(this).load(imageUrl)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.into(imageView);
5、设置跳过内存缓存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
6、设置下载优先级
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
7、设置缓存策略
Glide.with(this).load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
策略解说:
all:缓存元资源和转换后的资源
none:不作任何磁盘缓存
source:缓存源资源
result:缓存转换后的资源
8、设置加载动画
api也提供了几个常用的动画:比如crossFade()
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
R.anim.item_alpha_in:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="0.0" android:toAlpha="1.0"/> </set>
9、设置缩略图
这样会先加载缩略图,在加载全图
Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
10、设置加载尺寸
Glide.with(this).load(imageUrl).overrde(800,800).into(imageView);
11设置动态转换
Glide.with(this).load(imageUrl).centerCrop().into(imageView);
12、设置动态GIF加载方式
Glide.with(this).load(imageUrl).asBitmap().into(imageView);//显示gif静态图片 Glide.with(this).load(imageUrl).asGif().into(imageView);//显示gif动态图片
13、缓存的动态清理
Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行 Glide.get(this).clearMemory();//清理内存缓存 可以在UI主线程中进行
14、加载网络图片实现等比例缩放
Glide.with(mContext) .load(url) .asBitmap()//强制Glide返回一个Bitmap对象 .listener(new RequestListener<String, Bitmap>() { @Override public boolean onException(Exception e, String s, Target<Bitmap> target, boolean b) { LogUtil.e(url+"加载失败"+e.toString()); Glide.with(mContext) .load(R.mipmap.pic_default_vertical) .diskCacheStrategy(cache) .into(iv); return false; } @Override public boolean onResourceReady(Bitmap bitmap, String s, Target<Bitmap> target, boolean b, boolean b1) { return false; } }) .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int S_width = DisplayUtil.getScreenWidth(mContext); int S_height = DisplayUtil.getScreenHeight(mContext); float scale = ((float) height)/width; iv.setImageBitmap(bitmap); if(width>height){ float S_scale = S_height/(S_width*scale); if(isRightToLeft){ iv.setScale(S_scale,S_height*S_scale,0,false); }else{ iv.setScale(S_scale,0,0,false); } } } });