自定义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.
}
};
一些警告
正常情况下,你加载一个资源会把他们放到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.
}
});
注意,如果你想指定加载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和调色板的自定义资源。调色板可在在后台线程生成。?????更多内容会在以后推出。。。