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. H5自带进度条&滑块

    一.H5自带进度条 <div id="d1"> <p id="pgv">进度:0%</p> <progress id= ...

  2. tp5控制器调用,方法调用

      <?php //命名空间 namespace app\index\controller; use app\admin\controller\Deer; class User{ public ...

  3. Android设计模式——Builder(建造者)模式

    1.建造者模式是一步一步创建一个复杂对象的创建模式.该模式是为了将构建复杂对象的过程和他的部件解耦,使得构建过程和部件表示隔离开. 2.Bulider模式的定义是:将一个复杂对象的构建与它的表示分离, ...

  4. 子线程创建AlertDialog错误

    Can't create handler inside thread that has not called Looper.prepare()

  5. Android 数字四舍五入

    BigDecimal b = new BigDecimal(hour).setScale(1, BigDecimal.ROUND_HALF_UP); setScale(int newScale, in ...

  6. MySQL_索引原理与慢查询优化

    索引原理与慢查询优化 创建/删除索引的语法 #方法一:创建表时 CREATE TABLE 表名 ( 字段名1 数据类型 [完整性约束条件…], 字段名2 数据类型 [完整性约束条件…], [UNIQU ...

  7. 数据库过滤操作中 != 或者 <> 指定操作数并不能改匹配到NULL值

    数据库过滤操作中 != 或者 <> 指定操作数并不能改匹配到NULL值

  8. JQuery选择器排除某元素实现js代码

    使用JQuery选择器实现排除某一大元素下的某一元素的核心代码是使用.not()方法,如下所示: $("button").not("#save").attr(& ...

  9. html+css居中问题

    一.行级元素水平居中对齐(父元素设置 text-align:center) <div style="width: 200px; height: 100px;border: 1px so ...

  10. sdoi2013 spring(hash+容斥)

    大体思路是先求出来\(f[i]\)代表有至少\(i\)个位置相同的点对数. 然后就已经没什么好害怕的了(跟BZOJ3622一样) 然后这个\(f[i\)]怎么求呢? 最无脑的方法就是枚举位置,然后\( ...