Glide使用探索(四)——自定义显示控件

原文地址:https://github.com/bumptech/glide/wiki/Custom-targets

一、自定义target

Glide中可以通过自定义的Target的实现来加载多媒体

    1.SimpleTarget

       若需要加载一张Bitmap并与之交互(如在通知中显示等),就需要用到SimpleTarget。SimpleTarget为一些更大的Target接口提供了默认实现,并使得你只需关注加载结果。
   为了使用SimpleTarget,你需要在SimpleTarget的构造函数中传入欲加载资源的高宽(单位:像素),并实现onResourceReady(T resource, GlideAnimation animation)方法。

int myWidth = 512;
int myHeigth = 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中。当fragment或activity暂停或销毁时,Glide会暂停或取消资源加载。对于大部分SimpleTarget的实现来说,这种行为并不好,所以这种情况下,最好在Glide.with(context)中传入应用的Application而不是fragment或activity。
       此外,由于长时间运行的操作容易照成内存泄漏,因此,这种情况下,考虑使用静态内部类取代匿名内部类。

    2.ViewTarget

       若存在当view加载图片时观察或重写Glide的一些默认行为的需求,可以重写ViewTarget或其子类。
       若需要加载动态图片或在自定义控件中加载图片时并且Glide内置的ImageViewTarget及其子类无法适配时,就需要自定义ViewTarget子类。
       可以通过定义一个静态子类或匿名内部类的方式实现此功能。

Glide.with(yourFragment)
    .load(yourUrl)
    .into(new ViewTarget<YourViewClass, GlideDrawable>(yourViewObject) {

        @Override
        public void onResourceReady(GlideDrawable resource, GlideAnimation anim) {
                YourViewClass myView = this.view;
        }
    });

       注意:若需要加载Bitmap或GifDrawable,需要在.load(yourUrl)后加.asBitmap().asGif()方法,并将GlideDrawable替换为你实际加载的类型。
       可以通过实现Target的LifecycleListener回调实现更多控制,如onStart()onStop()onDestory()方法,这些方法将在包含你的控件的Fragment的生命周期中同步调用。

二、重新默认行为

若你只需要观察Glide的默认行为而非改变它,可以通过继承ImageViewTarget的两个子类实现:
   1) GlideDrawableImageViewTarget:默认加载asGif()的Target
   2) BitmapImageViewTarget:默认加载asBitmap()的Target
在onResourceReady方法中调用super可以保留默认的行为,并在调用super后可以添加任何你所需要的功能。
如生成Palette

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
                }
            });
        }
    });

注意:上面仅仅是个例子,不建议通过这样的方式生成Palette。可以通过Glide的ResourceTranscoder接口以及.transcode()方法在后台返回一个包含Bitmap与Palette的资源。上例的一个错误是关于一步操作:ViewHolder可以在Palette结束时已经被回收,这样可能导致会在错误的位置结束更新。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值