吐槽
中秋节啊,自己身为一个单身程序猿又不回家,还是在实验室学个新的框架吧,毕竟这个框架很实用,之前自己都还没用过,就很尴尬。
那中秋快乐啊
本文思维导图
这一篇主要就是讲基本用法的,因为自己之前也没用过,所以从最基础的来讲
我看的是郭神的博客开始的学习
https://blog.youkuaiyun.com/guolin_blog/article/details/53759439
Glide是什么
答曰:一种安卓平台上的图形加载框架,一种很好很好用的框架
然后网上说了下picasso这个框架和Glide的对比,这个框架也是安卓上的加载图片的一个框架,两者有相同的地方和不同的地方
Picasso的作用:
- 在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题
- 使用复杂的图片压缩转换来尽可能的减少内存消耗
- 自带内存和硬盘二级缓存功能
Glide的作用:
- GIF动画的解码
- 本地视频剧照的解码
- 缩略图的支持
- Activity生命周期的集成
- 转码的支持
- 动画的支持
- OkHttp和Volley的支持
- 其他功能:如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能
然后我们对比起来发现这两者的区别:
- Picasso所能实现的功能,Glide都能做,只是所需的设置不同
- Picasso体积比起Glide小太多
- Glide的好处是大型的图片流
用法
首先我们先肯定配置下这块
配置很简单,只要在Module的Gradle添加依赖即可
我看了下郭神博客里面说的Glide最新的稳定版本是3.7.0,所以用这个吧
第一步:我们添加一个依赖和一个权限
在app/build.gradle文件中添加依赖
compile 'com.github.bumptech.glide:glide:3.7.0'
然后再申请网络请求权限//因为要从网上获取图片
<uses-permission android:name="android.permission.INTERNET" />
第二步:加载图片
先看下最简单的用法,从网络上获取一张图片,放进一个imageView里面
先看下布局 很简单的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn_load"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取图片"
/>
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
然后网上找个我老婆D.va的图片的URL http://att.bbs.duowan.com/forum/201611/07/1854591iuaxsub3bldtutq.png
再看下逻辑代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mbutton;
private ImageView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mbutton = (Button)findViewById(R.id.btn_load);
show = (ImageView)findViewById(R.id.image_view);
mbutton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_load:
String url = "http://att.bbs.duowan.com/forum/201611/07/1854591iuaxsub3bldtutq.png";
Glide.with(this)
.load(url)
// .placeholder(R.drawable.noimage)
// .error(R.drawable.erronimage)
//.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(show);
break;
}
}
}
真的是超级超级简单的框架,很轻松就把网络图片就加载进去了
然后我们就发现这块就简单的一段代码就好了,真的是舒服啊
Glide.with(this).load(url).into(imageView);
- with()这个方法是创建一个加载图片的实例的,可以接收很多的参数,不论是在一个Activity还是在Fragment里面,都可以的
- load()指定加载的图片资源,各种方式的
- into()这块是最好理解的,因为它就指定了要放在那个ImageView里面,也还支持很多用法
//这块就是简单分析下,,,肯定要好好看这几块函数的
占位图和加载失败的图片
然后我们发现这块还是不满足我们的需求啊,因为我们还需要两种情况下的图片:
- 加载时间太长怎么办,不能让别人看到空白唉,很尴尬的
- 加载失败了怎么办,,,也不可能留一大堆空白唉
但是这个框架贴心的给我们弄好了这块,自己只需要准备图片就好了
首先先看下占位图
占位图就是指在图片的加载过程中,我们先显示一张临时的图片,等图片加载出来了再替换成要加载的图片。
就这种,好不容易找的图哈哈哈
就是我们在加载图片时候,还没加载之前先让这货呆在图片里面,然后等我们图片加载出来之后,就可以把这个替换掉
代码也很简单:
Glide.with(this)
.load(url)
.placeholder(R.drawable.noimage)//加入占位图片
// .error(R.drawable.erronimage)
.diskCacheStrategy(DiskCacheStrategy.NONE)//关闭缓存
.into(show);
看下效果:
然后我们再看下加载失败的情况下的处理:
异常占位图:
如果因为某些异常情况导致图片加载失败,比如说手机网络信号不好,这个时候就显示这张异常占位图
我也网上找了一个这个图片
用法也是一样的,先弄个图片,然后再加个函数
Glide.with(this)
.load(url)
.placeholder(R.drawable.noimage)
.error(R.drawable.erronimage)//异常处理的图片方法
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(show);
效果如下:
加载资源类型
因为它可以加载很多东西
先看下图片的加载:
1 加载网络资源
简单的ULR就好了
Glide.with(context).load(internetUrl).into(ImageView);
2 从文件中加载图片
File file = new File(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);
3 从资源id加载图片
int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);
4 加载Gif图片
这个和网络上的图片加载是一样的
String gifUrl = "xxxxx";
Glide.with( context ).load( gifUrl ).into( imageViewGif );
//然后还有好多的方式。以后遇到再说
##指定图片的格式和大小
这块也很神奇,因为Glide会自动判断图片的格式的
就是不论是图片还是GlF图片的,它都会自己判断的
然后图片大小这块,我们也发现这块人家框架都考虑好了,图片默认都是判断lmageView的大小的,然后把图片扔进去就好了
如果真的要自己去指定一个图片的固定大小也可以的
Glide.with(this)
.load(url)
.placeholder(R.drawable.noimage)
.error(R.drawable.erronimage)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100,100)//设置图片大小的
.into(show);
总结
简单的基本用法都看了下,这个框架真的很简单的使用,所以继续努力看这个框架的源码吧