Glide隐藏了一大推复杂的在后台的场景,Glide做了所有的网络请求和处理在后台线程中,准备好了切回到ui线程后更新ImageView.

假设ImageView不再是图像的最后一步。我们只要Bitmap本身。Glide提供了一个用Targets的方式的接收图片资源的Bitmap.Targets是回调函数,图字Glide做完所有的加载和处理之后返回结果。

一:Glide提供了好几种Targets,并且每个都有其明确的目的。我们从simpleTarget开始

private SimpleTarget target = new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
// do something with the bitmap
// for demonstration purposes, let's just set it to an ImageView
imageView1.setImageBitmap( bitmap );
}
}; private void loadImageSimpleTarget() {
Glide
.with( context ) // could be an issue!
.load( eatFoodyImages[0] )
.asBitmap()
.into( target );
}

  这段代码的第一部分创建了一个字段,声明了一个方法,即一旦Glide已经加载并处理完成图像,它将被调用。这个方法传了Bitmap作为一个参数。之后就可以使用Bitmap去进行我们的操作。

这段代码的第二部分是我们如何使用Glide用Targets和ImageView用法完全相同。你既可以传递一个Targets,也可以传递一个ImageView给into()方法。Glide自己处理并把结果给任何一个。添加.asBitmap,它强制Glide返回一个Bitmap对象。Glide也可以加载Gif和video.为了防止tatget的冲突(我们需要Bitmap)和未知资源和网络背后的URL(可能是一个GIF).,我们可以调用.asBitmap()告诉Glide我们需要一个图像。

二:除了实现简单版本的Glide的Target回调体统,还有一些地方需要我们注意。

1.首先是 SimpleTarget 对象的字段声明。into()中可以创建一个内部类供我们使用,但是这样就增加了一个可能性:就是Glide在做完图片请求之前,Android垃圾回收已经移除了匿名内部类,这样就会导致在Glide自动完成图片加载的时候回调不会被调用。所以声明的回调对象是一个字段对象,这样可以避免被Android垃圾回收机制回收。

2.with()可以传递当前应用的activity,这样当前activity销毁是Glide也会停止加载。如果你的tatget是独立于应用的activity的生命周期。这时候我们可以用context.getApplicationContext)。应用资源完全停止的时候,Glide才会杀死图片请求。

private void loadImageSimpleTargetApplicationContext() {
Glide
.with( context.getApplicationContext() ) // safer!
.load( eatFoodyImages[1]
.asBitmap()
.into( target2 );
}

  三:Target的指定尺寸

target没有指定大小,如果传递一个imageview座位参数传递给into(),Glide将会使用imageview的大小去限制图形的大小,如果加载的图片是 1000x1000 像素的,但是 ImageView 只有 250x250 像素,Glide 将会减少图片的尺寸去节省时间和内存。但是 使用target时候并没有已知大小。如果有一个指定的大小,可以加强回调。你可以加强回调。如果你知道这种图片应该要多大,你应该在你的回调声明中指定它以节省一些内存。

private SimpleTarget target2 = new SimpleTarget<Bitmap>( 250, 250 ) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
imageView2.setImageBitmap( bitmap );
}
}; private void loadImageSimpleTargetApplicationContext() {
Glide
.with( context.getApplicationContext() ) // safer!
.load( eatFoodyImages[1] )
.asBitmap()
.into( target2 );
}

  四:ViewTarget的使用

不直接使用imageview的原因是多种多样的,我们已经展示如何接受一个Bitmap.但是对于一个自定义的控件,Glide并不知道应该把图片加载到什么地方去,因为有些自定义的控件可能是复合控件。所以这时候我们就要用到ViewTarget.

首先是一个自定义控件,里面封装的有ImageView.

public class FutureStudioView extends FrameLayout {
ImageView iv;
TextView tv; public void initialize(Context context) {
inflate( context, R.layout.custom_view_futurestudio, this ); iv = (ImageView) findViewById( R.id.custom_view_image );
tv = (TextView) findViewById( R.id.custom_view_text );
} public FutureStudioView(Context context, AttributeSet attrs) {
super( context, attrs );
initialize( context );
} public FutureStudioView(Context context, AttributeSet attrs, int defStyleAttr) {
super( context, attrs, defStyleAttr );
initialize( context );
} public void setImage(Drawable drawable) {
iv = (ImageView) findViewById( R.id.custom_view_image ); iv.setImageDrawable( drawable );
}
}

 我们定义的ViewTarget

private void loadImageViewTarget() {
FutureStudioView customView = (FutureStudioView) findViewById( R.id.custom_view ); viewTarget = new ViewTarget<FutureStudioView, GlideDrawable>( customView ) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.setImage( resource.getCurrent() );
}
}; Glide
.with( context.getApplicationContext() ) // safer!
.load( eatFoodyImages[2] )
.into( viewTarget );
}

  在 target 回调方法中,我们使用我们创建的方法 setImage(Drawable drawable) 在自定义 view 类中去设置图片。另外确保你注意到我们必须在ViewTarget 的构造函数中传递我们自定义 view 作为参数:new ViewTarget<FutureStudioView, GlideDrawable>(customView).这应该涵盖了所有你需要的自定义 view。你也可以在回调中添加额外的工作。如,我们可以分析传入的 Bitmap 的主要的颜色并设置十六进制值给 TextView。

总结:target分为两种,SimpleTarget和ViewTarget两种,SimpleTarget返回bitmap对象,可以供我们使用。ViewTarget主要使用场景是自定义的控件,因为Glide不能直接设置到自定义控件上,所以需要借助ViewTarget来完成给自定义控件赋值的操作。我们可以先进行图片加载的网络请求,然后在target的回调中根据返回的参数对我们的需求进行逻辑处理。

Target 指定尺寸

Glide中的回调:targets的更多相关文章

  1. PHP中的回调函数和匿名函数

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

  3. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  4. [转]理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  5. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  6. C中的回调函数

    C语言中应用回调函数的地方非常多,如Nginx中: struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_c ...

  7. Java中的回调函数学习

    Java中的回调函数学习 博客分类: J2SE JavaJ#  一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置 ...

  8. JQuery中的回调对象

    JQuery中的回调对象 回调对象(Callbacks object)模块是JQuery中的一个很基础的模块,很多其他的模块(比如Deferred.Ajax等)都依赖于Callbacks模块的实现.本 ...

  9. Java中的回调

    又忙了一周,事情差不多解决了,终于有可以继续写我的博客了(各位看官久等了). 这次我们来谈一谈Java里的一个很有意思的东西--回调. 什么叫回调,一本正经的来讲,在计算机程序设计中,回调函数是指通过 ...

随机推荐

  1. ROS-动态参数

    前言:在节点外部改变参数的方式有:参数服务器.服务.主题以及动态参数. 1.新建cfg文件 在chapter2_tutorials包下新建cfg文件夹,在cfg文件夹下新建chapter2.cfg文件 ...

  2. BZOJ 3624 并查集 (Kruskal)

    思路: 先把所有能加上的水泥路都加上 判断哪些是必加的鹅卵石路 再重新做一遍最小生成树 加上必加的鹅卵石路 一直加鹅卵石路 判一下是不是=k 最后加上水泥路就好了 //By SiriusRen #in ...

  3. C# 实现透明可移动窗体

    1.设置窗体属性 this.BackColor this.TransparencyKey = this.BackColor; 2.窗体加载图片 this.BackgroundImage = globa ...

  4. 微信小程序中获取高度及设备的方法

    由于js中可以采用操纵dom的方法来获取页面元素的高度,可是在微信小程序中不能操纵dom,经过查找之后发现仅仅只有以下几个方法可以获取到高度 wx.getSystemInfoSync().window ...

  5. Spring meven 配置

    使用maven的仓库化管理,可以更方便有效的控制文件. 在官网下载maven. 官网的地址:http://maven.apache.org/download.cgi  请选择最新的版本下载, 这里我用 ...

  6. 验证码模拟登录TestHome

    前面我们做了一个xsrf的知乎的模拟登录,那么今天将会给大家分享一下小弟写的一段带验证码的登录脚本.   今天我们要做的是testerhome的模拟登录,在做这个模拟登录的时候,我发现需要验证码才能登 ...

  7. python包管理(distutils、easy_install、pip、setup.py/requirements.txt、wheel)

    distutils.distutils2 distutils是 python 标准库的一部分,2000年发布.使用它能够进行 python 模块的 安装 和 发布. distutils2 被设计为 d ...

  8. NYOJ 71 独木舟上的旅行【贪心】

    解题思路:给出船的最大载重量w,和n个人,每只船最多可以乘坐两个人,问怎样坐船使得安排的船只的数量最少.这n个人的体重为a1,a2,a3,---,an-1,an首先将体重按升序排列好,再考虑最重的人, ...

  9. redis 篇 - set

    set 无序集合 sadd key value 127.0.0.1:6379[7]> sadd s 3 (integer) 1 127.0.0.1:6379[7]> smembers s ...

  10. 大道至简第一章读后感 Java伪代码形式

    观看了大道至简的第一章之后,从愚公移山的故事中我们可以抽象出一个项目, 下面用Java 伪代码的形式来进行编写: import java(愚公移山的故事) //愚公移山 public class yu ...