自定义Target
除了可以加载图像,视频剧照,gif动画到View中,你还可以加载他们到实现了Target接口的自定义目标中。
SimpleTarget
如果你只是想加载一个Bitmap,并不想直接展示给用户而是有一些特殊用途,比如在通知栏中显示或者作为头像上传。 Glide也可以做到。 SimpleTarget为Target接口提供了大部分的默认实现。你可以专注于处理加载的结果。 为了使用SimpleTarget,你需要在它的构造函数中提供你要加载的资源的宽和高(单位像素),你还需要实现onResourceReady(T resource, GlideAnimation animation)方法。 一个典型的使用SimpleTarget的例子如下:
int myWidth = 512;
int myHeight = 384;
Glide.with(yourApplicationContext))
.load(youUrl)
.asBitmap()
.into(new SimpleTarget<Bitmap>(myWidth, myHeight) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// Do something with bitmap here.
}
};
==如果回调返回的是Bitmap .asBitmap()是必须的,否则会报错==
一些警告
正常情况下,你加载一个资源会把他们放到view中。当你的Activity或者Fragment被pause或者destroy时,Glide会暂停或取消加载,确保你不会加载那些根本不会显示的资源。 可是当我们使用SimpleTarget的时候,这可能并不是我们希望的行为。所以,当你调用Glide.with(context)的时候,你可以传入Application的context,而不是传入Activity或者Fragment。 此外,考虑到长时间的加载操作可能导致内存泄漏,请考虑使用静态内部类,而不是匿名内部类。
ViewTarget
如果你想加载一个图片到View中,但是你想观察或者覆盖Glide的默认行为。你可以覆盖ViewTarget或者它的子类。 当你想让Glide来获取view的的大小,但是由自己来启动动画和设置资源到view中,ViewTarget是个不错的选择。如果你要加载一个图片到ImageView之外的自定义view中,那么ImageViewTarget或者它的子类就不能满足你的要求,此时继承ViewTarget就特别合适。 你可以静态的定义一个ViewTarget的子类,或者传递一个匿名内部类到你的加载调用里:
Glide.with(yourFragment)
.load(yourUrl)
.into(new ViewTarget<YourViewClass, GlideDrawable>(yourViewObject) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation anim) {
YourViewClass myView = this.view;
// Set your resource on myView and/or start your animation here.
}
});
==如果想要回调返回的是Drawable,那么你需要传入泛型GlideDrawable,否则会报错;然后利用glideDrawable.getCurrent()得到Drawable对象==
注意,如果你想指定加载Bitmap还是GifDrawable,请在.load(yourUrl)调用后面直接添加.asBitmap()或者.asGif(),同时将ViewTarget的类型参数GlideDrawable换成对应加载的类型。 为了更多控制,你也可以在Target实现LifecycleListener回调,onStart()、onStop()或者onDestroy()会和你view所在的fragment的生命周期保持同步。
覆盖默认行为
如果你只想观察不想修改Glide的默认行为,你可以继承任何一个Glide对ImageViewTargets的默认实现。
GlideDrawableImageViewTarget - 默认的Target,用于正常的加载和asGif()。
BitmapImageViewTarget - 当使用asBitmap()加载时,使用的默认Target。
只有你在每个方法里面调用super(),将会保留默认的行为,同时还可以添加一些你希望的功能。
例如,想要生成一个调色板,你可以这样做。
Glide.with(yourFragment)
.load(yourUrl)
.asBitmap()
.into(new BitmapImageViewTarget(yourImageView)) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
super.onResourceReady(bitmap, anim);
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
// Here's your generated palette
}
});
}
});
虽然这个例子还不错,但是,通常情况下,我不推荐用这个方式生成调色板。请查看Glide的 ResourceTranscoder 接口和.transcode()方法,考虑返回一个包含Bitmap和调色板的自定义资源。调色板可在在后台线程生成
网友评论