【Android】Glide的简单使用(上)

文章目录

引入

GlideGoogle员工的开源项目,Google官方App中已经使用,在2015年的Google I/O上被推荐。

Glide的优点:

  • 使用简单
  • 可配置度高,自适应程度高
  • 支持多种数据源,网络、本地、资源、Assets
  • 支持Gif图片。
  • 支持WebP
  • 加载速度快、流畅度高。
  • Glidewith()方法不光接受Context,还接受ActivityFragment,这样图片加载会和Activity/Fragment的生命周期保持一致,比如Pause状态在暂停加载,在Resume的时候又自动重新加载。
  • 支持设置图片加载优先级
  • 支持缩略图,可以在同一时间加载多张图片到同一个ImageView中,例如可以首先加载只有ImageView十分之一大小的缩略图,然后等再加载完整大小的图片后会再显示到该ImageView上。
  • 内存占用低,Glide默认的Bitmap格式是RGB_565,比ARGB_8888格式的内存开销要小一半,所以图片质量会稍微差一些,当然这些配置都是可以修改的。
  • Glide缓存的图片大小是根据ImageView尺寸来缓存的的。这种方式优点是加载显示非常快。且可以设置缓存图片的尺寸
  • 默认使用HttpUrlConnection下载图片,可以配置为OkHttp或者Volley下载,也可以自定义下载方式。
  • 默认使用两个线程池来分别执行读取缓存和下载任务,且可以自定义。
  • 默认使用手机内置存储进行磁盘缓存,可以配置为外部存储,可以配置缓存大小,图片池大小。
  • 在加载同样配置的图片时,Glide内存占用更少,因为Glide是针对每个ImageView适配图片大小后再存储到磁盘的,这样加载进内存的是压缩过的图片,内存占用自然就比较少。这种做法有助于减少OutOfMemoryError的出现。
  • 高效处理Bitmap,使用Bitmap Pool来对Bitmap进行复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力

缺点:

  • 体积相对来说比较大,目前最新版的大小在500k左右
  • 当我们从远程URL地址下载图片时,Picasso相比Glide要快很多。可能的原因是Picasso下载完图片后直接将整个图片加载进内存,而Glide还需要针对每个ImageView的大小来适配压缩下载到的图片,这个过程需要耗费一定的时间。(当然我们可以使用thumbnail()来减少压缩的时间)

使用

加载图片,需要至少传入三个参数:

  • with(Context context):Context是很多android api所必要的参数,glide也一样。可以传递Activity/Fragment,而且
    它会和Activity/Fragment的生命周期进行绑定。
  • load(String imageUrl):图片的URL地址。
  • into(ImageView targetImageView):需要将加载的图片显示到的对应的ImageView
java 复制代码
@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

  GlideApp.with(this).load("xxxxxx").into(imageView);
}

常用方法:

从网络加载图片
java 复制代码
GlideApp.with(context).load(internetUrl).into(targetImageView);
从文件加载图片
java 复制代码
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"file.jpg");
GlideApp.with(context).load(file).into(imageViewFile);
加载resource资源
java 复制代码
int resourceId = R.mipmap.ic_launcher;
GlideApp.with(context).load(resourceId).into(imageViewResource);
加载URI地址
java 复制代码
GlideApp.with(context).load(uri).into(imageViewUri);
设置占位图
java 复制代码
GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.placeholder) // 可用drawable
    .into(imageViewPlaceholder);
出错时的图片
java 复制代码
GlideApp  
    .with(context)
    .load("xxxxx")
    .placeholder(R.mipmap.ic_launcher) 
    .error(R.mipmap.wrong) // 出错时放置的图片
    .into(imageViewError);
占位图

上面的error()展位图是当资源无法获取时使用的,例如图片地址无效,但是还有另外一种情况是你传递了null值。比如在一个显示用户资料列表中,由于并不是

每个人都有头像图片,所有这时可能会传递null值。如果想要指定一个在传递null值时显示的错误图片可以使用.fallback().

java 复制代码
String nullString = null; // could be set to null dynamically

GlideApp  
    .with(context)
    .load(nullString)
    .fallback(R.drawable.wrong2)
    .into(imageView);
图片过渡的Transitions

无论你是否使用占位图,在UI过程中改变ImageView的图片都是一个很大的动作。有一个简单的方法可以使这种改变变的更平滑,更容易让人接受,那就是使用
crossfade动画。

java 复制代码
GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.ic_launcher) // can also be a drawable
    .error(R.mipmap.wrong) // will be displayed if the image cannot be loaded
    .transition(DrawableTransitionOptions.withCrossFade())// withCrossFade(int duration)方法可以传入时间,默认时间是300毫秒
    .into(imageViewCombined);
自定义过渡动画

上面提供了crossfade动画,但是有些时候我们需要自定义更多的样式。
Glide也是支持xml中自定义的动画文件的。

java 复制代码
GlideApp  
    .with(context)
      .load(eatFoodyImages[0])
      .transition(GenericTransitionOptions.with(R.anim.zoom_in))
      .into(imageView1);
图片大小调整

大多数情况下,实际放置的大小和获取的大小无法完全适配。

Glide优化了在内存上的占用。Glide在缓存和内存里自动限制图片的大小去适配ImageView的尺寸。Picasso也有同样的能力,但需要调用fit()方法。用Glide时,如果图片不需要自动适配ImageView,调用override(horizontalSize, verticalSize),它会在将图片显示在ImageView之前调整图片的大小。

这个设置也有利于没有明确目标,但在已知尺寸的视图 上。例如,如果app想要预先缓存在splash屏幕上,还没法测量出摆放的控件具体宽高。但是如果你已经知道图片应当为多大,使用override可以提供一个指定的大小的图片。

java 复制代码
GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .override(600, 200) // 将图像大小调整为这些尺寸(以像素为单位)。调整大小不考虑纵横比
    .into(imageViewResize);
缩放图片

对于任何图像的任何处理,调整图像的大小可能会扭曲长宽比,丑化图片的显示。

Glide提供了变换去处理图片显示:

CenterCrop()会缩放图片让图片充满整个ImageView的边框,然后裁掉超出的部分。ImageVIew会被完全填充满,但是图片可能不能完全显示出。
fitCenter()会缩放图片让两边都相等或小于ImageView的所需求的边框。图片会被完整显示,可能不能完全填充整个ImageView

java 复制代码
GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .override(600, 200)
    .centerCrop() // 这种裁剪技术缩放图像,使其填充请求的边界,然后裁剪多余的边界。
    .into(imageViewResizeCenterCrop);
播放gif
java 复制代码
String gifUrl = "https://s2.loli.net/2023/12/05/lM4cKaQUPmeurT8.gif";

GlideApp  
    .with(context)
    .load(gifUrl)
    .into(imageViewGif);

这里注意:如果提供的源不是Gif,可能是一个普通的图片。即使是一个完好的图片(非Gif),Glide也会加载失败。.error()回调方法会被调用,并加载错误占位图,那么可以进行强迫生成gif。↓

asGif()

这样引入了一个额外的方法.asGif()强迫生成一个Gif

java 复制代码
GlideApp  
    .with(context)
    .asGif()
    .load(gifUrl)
    .error(R.drawable.wrong)
    .into(imageViewGif);
Gif当作Bitmap播放

如果需要显示一组网络URL,可能包括普通的图片或者Gif。如果你只是想要显示Gif的第一帧(图片),当URl指向的的确是Gif,你可以调用asBitmap()将其作为常规图片显示。

java 复制代码
GlideApp  
    .with(context)
    .asBitmap()
    .load(gifUrl)
    .into(imageViewGif);
显示本地视频缩略图
java 复制代码
String filePath = "/storage/emulated/0/Pictures/targetVideo.mp4";

GlideApp  
    .with(context)
    .asBitmap()
    .load(Uri.fromFile(new File(filePath)))
    .into(imageViewGifAsBitmap);
相关推荐
SRC_BLUE_171 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
无尽的大道4 小时前
Android打包流程图
android
镭封6 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰4876 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛6 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
IAM四十二6 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer
奶茶喵喵叫7 小时前
Android开发中的隐藏控件技巧
android
Winston Wood8 小时前
Android中Activity启动的模式
android
众乐认证8 小时前
Android Auto 不再用于旧手机
android·google·智能手机·android auto
三杯温开水9 小时前
新的服务器Centos7.6 安卓基础的环境配置(新服务器可直接粘贴使用配置)
android·运维·服务器