Glide不但可以把图片、视频剧照、GIF动画加载到View,还可以加载到自定义的Target实现中。Target就是使用Glide获取到资源之后资源作用的目标,我们通常是用Glide加载完资源后显示到ImageView中,这个ImageView就是目标。
Target架构的接口包括:

  • com.bumptech.glide.manager.LifecycleListener
  • com.bumptech.glide.request.target.Target<R>
  • com.bumptech.glide.request.target.SizeReadyCallback

Target架构的类层次:

  • com.bumptech.glide.request.target.BaseTarget<Z> (implements com.bumptech.glide.request.target.Target<R>)

    • com.bumptech.glide.request.target.SimpleTarget<Z>

      • com.bumptech.glide.request.target.AppWidgetTarget
      • com.bumptech.glide.request.target.NotificationTarget
      • com.bumptech.glide.request.target.PreloadTarget<Z>
    • com.bumptech.glide.request.target.ViewTarget<T,Z>
      • com.bumptech.glide.request.target.ImageViewTarget<Z> (implements com.bumptech.glide.request.animation.GlideAnimation.ViewAdapter)

        • com.bumptech.glide.request.target.BitmapImageViewTarget
        • com.bumptech.glide.request.target.DrawableImageViewTarget
        • com.bumptech.glide.request.target.GlideDrawableImageViewTarget
  • android.graphics.drawable.Drawable
    • com.bumptech.glide.load.resource.drawable.GlideDrawable (implements android.graphics.drawable.Animatable)

      • com.bumptech.glide.request.target.SquaringDrawable
  • com.bumptech.glide.request.target.ImageViewTargetFactory

SimpleTarget

如果你只是想通过Glide加载一个Bitmap而不是把它显示到View中,比如想显示到通知栏里、作为上传头像等,Glide为你提供了灵活的接口SimpleTarget<Z>
SimpleTarget相对于上层接口Target提供了合理的默认实现,以便让你专注于处理已加载好的资源。
使用SimpleTarget,你需要提供你需要资源的宽高值(像素)到SimpleTarget构造器,并实现onResourceReady(T resource, GlideAnimation animation)方法:

int myWidth = 512;
int myHeight = 384;Glide.with(yourApplicationContext)).load(youUrl).asBitmap().into(new SimpleTarget<Bitmap>(myWidth, myHeight) {@Overridepublic void onResourceReady(Bitmap bitmap, GlideAnimation anim) {// Do something with bitmap here.}};

可能你已经注意到了,上面用的上下文是应用上下文ApplicationContext。因为通常我们把资源加载到View中,当fragment或activity暂停或销毁时,Glide也会暂停或取消请求,以确保不会浪费时间和资源在你不需要的显示上。
但对SimpleTarget来说,并没有生命周期,所以调用Glide.with(context)时传application上下文,而不是fragment或activity。
同时,考虑到长时间运行的操作可能会导致内存泄露,如果你要执行长时间运行的操作,要用静态内部类,而不是匿名内部类。

ViewTarget

如果你在加载资源到View时想要查看或覆盖某些Glide默认行为时,可以重写ViewTarget或它的子类。
通常情况下你想要Glide决定你View的大小时用ViewTarget作为基类即可, 但当你想要处理开始动画或者把资源显示到自定义View中时,ViewTarget子类就特别的合适了,尤其是通过Glide内置的ImageViewTarget 和其子类显示ImageView出问题时。
ViewTarget使用:可以创建静态的子类,或者匿名内部类方式创建:

Glide.with(yourFragment).load(yourUrl).into(new ViewTarget<YourViewClass, GlideDrawable>(yourViewObject) {@Overridepublic void onResourceReady(GlideDrawable resource, GlideAnimation anim) {YourViewClass myView = this.view;// 把资源设置到myView,开始播放动画}});

注意:如果你想指定加载Bitmap或GifDrawable,必须在.load(yourUrl)之后马上调用 .asBitmap().asGif(),并且把ViewTarget参数中的类型替换成你要加载的类型。
可以实现LifecycleListener接口以便根据生命周期进行各种操作。
如果你只是想查看而不是改变Glide的默认行为,可以使用ImageViewTarget的两个子类:

  • GlideDrawableImageViewTarget - 正常加载和使用asGif()进行加载的默认目标.
  • BitmapImageViewTarget - 使用asBitmap()进行加载的默认目标.
    如:
Glide.with(yourFragment).load(yourUrl).asBitmap().into(new BitmapImageViewTarget(yourImageView)) {@Overridepublic void onResourceReady(Bitmap bitmap, GlideAnimation anim) {super.onResourceReady(bitmap, anim);Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {  @Overridepublic void onGenerated(Palette palette) {// Here's your generated palette}});}});

References:
1. Norman Peitek's blog
2. Glide Wiki

Glide之Target相关推荐

  1. android 图片加载库 Glide 的使用介绍

    一:简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会 ...

  2. Android开发之Glide设置View背景图的方法

    先看效果图: 看了下效果还可以,虽然此方法在Glide4.1.2版本已过时但是还可以使用 针对Glide4.0以上版本设置View背景图方法如下:Kotlin版本 package com.xiayiy ...

  3. java getrequest_Java Target.getRequest方法代码示例

    import com.bumptech.glide.request.target.Target; //导入方法依赖的package包/类 private void untrackOrDelegate( ...

  4. Android使用Glide框架加载网络图片(解决无报错图片不显示问题)

    清单文件中添加访问网络权限并防止图片不显示 activity加载自己云服务器网页图片 package com.example.app3;import androidx.appcompat.app.Ap ...

  5. Glide框架高斯模糊图片处理

    转自:https://ligboy.org/?p=380 对于不需要看废话的请直接Show me the code 对于模糊处理,一般的解决方案有四种: Java实现的算法处理: NDK实现的算法处理 ...

  6. Android笔记之(图片高斯+Glide实现微信图片加载策略+仿微信进度条)

    很久以前就想自己实现一下仿微信图片加载的那种策略了,先加载一张模糊的图片,然后再加载清晰大图,今天研究了一下,不过要是Glide支持进度条显示就好了,不得不说Glide很强大, 不啰嗦了,直接上代码了 ...

  7. Glide使用详解(一)

    该文章基于Glide v3.7.0版本 Glide v4版本详解请移步: http://blog.csdn.net/shangmingchao/article/details/78219558 一. ...

  8. Glide源码--执行流程

    Glide的基本使用 看一下郭神的博客,Android图片加载框架最全解析(八),带你全面了解Glide 4的用法 图片加载机制的基本流程 我们从这行代码看起 Glide.with(this).loa ...

  9. Glide 如何实现正确加载图片而没有错位

    我们在平时的项目使用下面的代码 GlideApp.with(context).load(url).into(imageView); 当我们在常见的列表界面中(如 recycleview 实现的列表), ...

最新文章

  1. JSPServlet学习手册
  2. ExtAspNet应用技巧(三) - 302与Asp.Net Ajax
  3. windowslive writer 发布问题
  4. 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )
  5. ML:MLOps系列讲解之《MLOps原则之监控/“机器学习成绩”系统/可再现性/松散耦合架构(模块化)/基于ML的软件交付指标/MLOps原则和实践的总结》解读
  6. python tempfile模块用不了_Python tempfile:坏了还是我做错了?
  7. 去掉(不显示)关闭QQ游戏后跳出的广告
  8. Android Service学习之IntentService 深入分析
  9. 不要再次进行阅读的计算机论文与理由(持续更新中)
  10. 【Vscode】调试DotNet Core代码
  11. 树莓派c语言运行_树莓派完成简单的编程(四)
  12. 三分钟教你用 Scarlet 写一个 WebSocket App
  13. obj.val 非数组_在Ruby中使用Array.new(size,obj)创建数组
  14. php实现soap,PHP的SOAP原理及实现详解
  15. Go1.17 这个新特性竟是 6 年前提出来的
  16. linux 存文件格式,windows保存的文件传输到linux中格式转换
  17. python标准库——time模块
  18. 用python实现千图成像工具,快给你的男/女神做一个吧~
  19. 本地上传文件到服务器
  20. 如何在Windows7系统下进行C盘的扩容

热门文章

  1. mysql阶梯统计_数据库问题成了我成长的阶梯
  2. PHPExcel插件的使用2——基本数据导入
  3. 对github的中间人攻击
  4. “XcodeGhost”病毒之后,苹果更应注…
  5. 用python实现实时监控网卡流量(类似 top 动态刷新)
  6. 电脑计算机无法搜索,电脑中的搜索功能无法使用了怎么办
  7. LeetCode的朴素无华且枯燥
  8. python怎么快速打括号_中括号怎么打-【python每日一练】有效括号
  9. 【Jenkins】Jenkins :首次登录直接使用 admin 账户
  10. iClient for OpenLayer结合Mapv制作支援迁移路线