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结束时已经被回收,这样可能导致会在错误的位置结束更新。

### Glide库的使用方法 #### 什么是GlideGlide是一个专注于快速高效加载图片的Android开源库。它支持多种数据源,包括本地文件、网络URL以及资源ID等,并提供了灵活的API来满足开发者对于图像处理的各种需求[^1]。 #### 添加依赖 要在项目中集成Glide,首先需要在`build.gradle`文件里加入相应的Maven仓库和依赖项声明: ```gradle dependencies { implementation 'com.github.bumptech.glide:glide:4.x' annotationProcessor 'com.github.bumptech.glide:compiler:4.x' // 如果使用Kotlin则替换为kapt } ``` 注意:这里的`4.x`应替换成具体的版本号,比如最新的稳定版可能是`4.12.0`或其他更新版本。 当应用经过混淆工具(如ProGuard或DexGuard)处理时,为了防止某些类被错误移除或者重命名影响功能正常运作,需额外配置保留特定元数据的信息: ```proguard -keep public class * implements com.bumptech.glide.module.GlideModule -keepresourcexmlelements manifest/application/meta-data@value=GlideModule ``` 以上设置确保即使应用程序被打包优化也不会丢失必要的初始化逻辑。 #### 基本用法示例 下面展示了一个简单的例子说明如何利用Glide加载一张远程图片到ImageView控件当中去: ```java import com.bumptech.glide.request.target.ImageViewTarget; // 加载指定url路径下的图片并显示于image_view对象之上 Glide.with(context) .load(imageUrl) .into(imageView); ``` 此代码片段展示了最基本的调用方式——只需要提供上下文环境(`context`)、目标视图组件(`imageView`)还有待获取的数据位置(`imageUrl`)即可完成整个流程。 另外还可以自定义转换效果,例如圆形裁剪头像之类的操作可以通过第三方插件辅助实现,推荐尝试`glide-transformations`这个扩展库[^2]: ```xml <dependency> <groupId>jp.wasabeef</groupId> <artifactId>glide-transformations</artifactId> <version>LATEST_VERSION</version> </dependency> ``` 之后就可以很方便地应用于实际场景之中了: ```java GlideApp.with(context) .load(url) .transform(new CropCircleWithBorderTransformation(5, Color.WHITE)) .into(imageView); ``` 这里我们引入了一种带边框圆角变换的效果作为演示案例[^2]。 尽管如此,在现代开发趋势下也有其他替代方案可供考虑,例如Coil就是一种新兴的选择,尤其适合Jetpack Compose框架使用者[^3]。 #### 调试模式注意事项 有时候出于性能考量或是减少APK体积的目的,可能会把一些占位符素材单独存放在debug目录结构底下;这样的话正式发布的构建就不会包含这些临时性的图形资产了[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值