Glide V4 框架新特性(Migrating from v3 to v4)

Android Glide4 异步图片框架


不了解官方推举使用Glide框架,可以先阅读Glide框架介绍.

Glide v4版本前几天新发布,一些新特性也需要学习下。

从V3到V4迁移,改变的行为和配置如下:

  • Options
    • RequestBuilder
    • RequestOptions
    • TransitionOptions
    • Generated API
  • Types and Targets
    • Picking Resource Types
    • Drawables
    • Targets
      • Cancellation
  • Configuration
    • Applications
    • Libraries
    • Manifest parsing

Options:


在Glide v3中,options是由一系列复杂的多个builder来处理。

在Glide v4中,处理options(centerCrop(),placeholder()等 )方式发生了改变。处理Options的方式将由单一类型的Builder和一系列提供Buidler的options对象所取代。 Glide`s generated API进一步简化,通过合并多个options和来源inegration libraries使用的Builder去创建单个流畅的API.

RequestBuilder:

API方法:

  • listener()
  • thumbnail()
  • load()
  • into()

在Glide v4中,从几种类型(Bitmap,Drawable,GifDrawable等)中,选取一个来创建指定类型的RequestBuilder。RequstBuilder对象能控制自身的Options,包括Model(url,uri等等),thumbnail,lisRequestlistener。ReuqstBuilder的开启使用通过into()或者preload()

使用案例如下:

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment)
    .load(url);

requestBuilder
    .thumbnail(  Glide.with(fragment)
            .load(thumbnailUrl) )
    .listener(requestListener)
    .load(url)
    .into(imageView);
RequestOptions

API方法:

  • centerCrop()
  • placeholder()
  • error()
  • priority()
  • diskCacheStrategy()

在v3中,大多数的options操作移到RequestOptions中。

一个包含一些列options的RequstOptions能够被多个RequstBuilder所运用。

使用案例如下:

RequestOptions myOptions = new RequestOptions()
    .fitCenter()
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .override(100, 100);

Glide.with(fragment)
    .load(url)
    .apply(myOptions)
    .into(drawableView);

Glide.with(fragment)
    .asBitmap()
    .apply(myOptions)
    .load(url)
    .into(bitmapView);
TransitionOptions

API方法:

  • crossFade()
  • animate()

TransitionOptions是用于控制占位图片或者thumbnails图片切换到真正需要加载的图片之间的过度。

TransitionOptions包含三个子类:

  • GenericTransitionOptions
  • DrawableTransitionOptions
  • BitmapTransitionOptions

移除默认的transition,使用TransitionOptions.dontTransition()

使用案例:

Glide.with(fragment)
    .load(url)
    .transition(withCrossFade(R.anim.fade_in, 300));
Generated API

为了更好的使用Glide v4 , Glide为运用程序提供了一个generated API. 运用程序中应该创建一个带有@GlideModule注解的AppGlideModule子类,来使用generated API。更多闲情,阅读Generated API介绍.

Generated API添加一个GlideApp类,该类能够提供对RequestBuilder和RequestOptions子类的访问。RequestOptions子类包含RequestOptions包含的全部方法和GlideExtensions定义的方法。RequestBuilder子类不需要使用apply方法,来访问RequestBuilder子类中全部方法。

注意点:使用GlideApp,需要添加annotationProcessor 的依赖:来源

   annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'

使用Generated AP,一个RequestOptions被内嵌调用:

GlideApp.with(fragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .priority(Priority.HIGH)
    .into(imageView);

不使用Generated API的方式案例:

Glide.with(fragment)
    .load(url)
    .apply(centerCropTransform()
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.error)
        .priority(Priority.HIGH))
    .into(imageView);

Types and Targets


Picking Resource Types

在使用Glide时,可以指定你想加载的资源类型。倘若你指定了一个超类的类型,Glide将尝试加载一个可用的子类类型。例如,指定加载类型是Drawable,Glide会加载BitmapDrawable或者GifDrawable。

Glide默认的请求是Drawable类型的:

Glide.with(fragment).load(url)

指定Bitmap类型:

Glide.with(fragment).asBitmap()

指定文件路径(最适合本地图片):

Glide.with(fragment).asFile()

去下载一个远程的文件写入缓存中,且获得一个文件路径:

Glide.with(fragment).downloadOnly()

//或者你已经有一个Url。
Glide.with(fragmetn).download(url);
Drawables

在Glide v3中GlideDrwable已经被移除,有利于anroid标准的Drawable。GlideBitmapDrawable也已经被移除,有利于BitmapDrawable。

判断一个Drawable是否是动画的,通过Animatable可以判断:

boolean isAnimated = drawable instanceof Animatable
Targets

onResourceReady()的参数发生了改变

//原来的
onResourceReady(GlideDrawable drawable, GlideAnimation<? super GlideDrawable> anim)

//现在改成以下形式:
onResourceReady(Drawable drawable, Transition<? super Drawable> transition);

onLondFailed的签名也改变了:

//原来的
onLoadFailed(Exception e, Drawable errorDrawable)

//现在的
onLoadFailed(Drawable errorDrawable)

使用RquestListener可以知道,在加载过程中失败的信息。

Cancellation

原本的Glide.with(Target)移到RequestManager中,使用方式如下:

Glide.with(fragment).clear(target)

清除不是必须要求的,但是使用RequestManger开启加载,和清除加载,效果会更好。Glide v4跟踪每个Activity和Fragment的请求,因此需要适当的生命周期去清除这些请求。

Configuration


在Glide v3中,使用一个或者多个GlideModules来执行配置。在Glide v4中,配置工作是类似的,但稍微更复杂的系统配置。

更多新配置,请阅读Configuration页面

Applications

在Glide v4中,转换和进入AppGlideModule:

@GlideModule
public class GiphyGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setMemoryCache(new LruResourceCache(10 * 1024 * 1024));
  }

  @Override
  public void registerComponents(Context context, Registry registry) {
    registry.append(Api.GifResult.class, InputStream.class, new GiphyModelLoader.Factory());
  }
}

需注意:@GlideModule注解是必需的。

若是运用程序中具备多个GlideModules,将其中一个转成AppGlideModule,其他的转成LibraryGlideModules。倘若,存在AppGlideModule的时候,才会发现LibraryGlideModule。因此,不能仅适用LibraryGlideModules。

Libraries

拥有一个或者多个的GlideModule的库应该使用LibraryGlideModule而不是AppGlideModule。库不应是使用AppGlideModules,因为每个运用程序只有一个AppGliModules。因此,包含在唯一一个库的AppGlideModules,不会阻止库去设置库本身的options。多个库包含一个AppGlideMoudle,它会导致冲突。

在V4 中,Volley GlideModule的转换:

@GlideModule
public class VolleyLibraryGlideModule extends LibraryGlideModule {
  @Override
  public void registerComponents(Context context, Registry registry) {
    registry.replace(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(context));
  }
}
Manifest parsing

为了简化迁移,清单解析和旧的GlideModule接口已经被弃用,但是在V4中任然支持。AppGlideModules, LibraryGlideModules 和 弃用的 GlideModules已旧可以在程序中共存。

但是,为了避免检查元数据(和相关的错误)带来的性能开销。可以通过覆盖AppGlideModule中的isManifestParsingEnabled()来,控制是否解析清单。

@GlideModule
public class GiphyGlideModule extends AppGlideModule {
  @Override
  public boolean isManifestParsingEnabled() {
    return false;
  }

  ...
}

资源参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值