Glide v4通過注解處理器生成一個API,允許應用程序以一個靈活的API訪問RequestBuilder、RequestOptions的所有選項以及包含的集成庫中定義的選項。
生成的API服務于兩個目的:
雖然這兩個任務都可以通過手動編寫自定義RequestOptions的子類來實現(xiàn),但這樣做是有挑戰(zhàn)性的,并且會產生不太靈活的API。
要使用生成的API,您需要執(zhí)行兩個步驟:
repositories {
mavenCentral()
}
dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC1' }
有關詳細信息,請參閱[下載和設置頁面](Download-Setup.md)。
2. 在應用程序中包含一個[AppGlideModule](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/module/AppGlideModule.html)實現(xiàn):
package com.example.myapp;
import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule;
@GlideModule public final class MyAppGlideModule extends AppGlideModule {}
[AppGlideModule](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/module/AppGlideModule.html)實現(xiàn)必須始終使用[@GlideModule](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideModule.html)注解。如果沒有使用該注解,該模塊將不會被發(fā)現(xiàn),并且您會在**Glide**的日志標記中看到一條無法找到模塊的警告。
### Kotlin
如果您使用Kotlin,您可以:
1. 實現(xiàn)如上所示的所有的Glide的注解類(包括:AppGlideModule,LibraryGlideModule和GlideExtension)。
2. 在Kotlin中實現(xiàn)注解類,需要在Glide中添加kapt依賴關系,而不是annotationProcessor依賴關系:
dependencies { kapt 'com.github.bumptech.glide:compiler:4.0.0-RC1' }
要使用kapt,請參閱[官方文檔](https://kotlinlang.org/docs/reference/kapt.html)。
## 使用生成的API
默認情況下,生成的API會跟您的[AppGlideModule](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/module/AppGlideModule.html)實現(xiàn)在同一包下,類名為GlideApp。使用該API,應用程序可以在所有的負載中用**GlideApp.with()**代替**Glide.with()**。
GlideApp.with(fragment) .load(myUrl) .placeholder(R.drawable.placeholder) .fitCenter() .into(imageView);
不同于**Glide.with()**,生成的API可以直接調用**fitCenter()**和**placeholder()**方法,而不必作為單獨的[RequestOptions](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/request/RequestOptions.html)對象傳入。
## GlideExtension
Glide的生成的API可以由應用程序和庫擴展。擴展使用帶注解的靜態(tài)方法來添加新的選項,修改已有的選項或者添加其他類型。
[GlideExtension](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideExtension.html)注解標記一個類擴展了Glide的API。該注解必須出現(xiàn)在任何擴展了Glide API的類上。如果該注解不存在,那么注解方法將會被忽略。
通過GlideExtension注解標記的類被認為是實用程序類。這些類應該包含私有的空的構造函數(shù),也應該是final的并且只包含靜態(tài)方法。注解類可能包含靜態(tài)變量跟引用其他類或者對象。
應用程序可以實現(xiàn)多個GlideExtension注解類。庫也可以實現(xiàn)任意數(shù)量的GlideExtension注解類。當一個AppGlideModule被找到時,所有的有效的GlideExtensions將被合并并創(chuàng)建一個單一的API里。沖突會導致Glide注解處理器錯誤。
GlideExtension注解類可以定義兩種類型的擴展方法:
1. [GlideOption](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideOption.html):給RequestOptions添加自定義的選項。
2. [GlideType](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideType.html):添加新的資源類型的支持(GIFs,SVG etc)。
### GlideOption
[GlideOption](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideOption.html)注解靜態(tài)方法擴展[RequestOptions](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/request/RequestOptions.html)。**GlideOption**被用在:
1. 定義一個在程序中頻繁被用到選項組。
2. 添加新的選項,通常結合Glide的[Option](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/load/Option.html)類使用。
定義選項組,您可以這樣寫:
@GlideExtension public class MyAppExtension { // Size of mini thumb in pixels. private static final int MINI_THUMB_SIZE = 100;
private MyAppExtension() { } // utility class
@GlideOption public static void miniThumb(RequestOptions options) { options .fitCenter() .override(MINI_THUMB_SIZE); }
在[RequestOptions](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/request/RequestOptions.html)的子類中生成一個如下的方法:
public class GlideOptions extends RequestOptions {
public GlideOptions miniThumb() { MyAppExtension.miniThumb(this); }
... }
您可以在方法包含許多希望添加的參數(shù),只需要保證第一個參數(shù)是[RequestOptions](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/request/RequestOptions.html):
@GlideOption public static void miniThumb(RequestOptions options, int size) { options .fitCenter() .override(size); }
附加的參數(shù)將作為參數(shù)添加到生成方法中:
public GlideOptions miniThumb(int size) { MyAppExtension.miniThumb(this); }
接著,您可以使用生成的GlideApp類調用您自定義類型:
GlideApp.with(fragment) .load(url) .miniThumb(thumbnailSize) .into(imageView);
使用**GlideOption**注解的方法要求是靜態(tài)的,返回類型為void。請注意:生成的方法將不適用于標準的**Glide**跟**RequestOptions**類。
### GlideType
[GlideType](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideType.html)注解擴展[RequestManager](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/RequestManager.html)的靜態(tài)方法。GlideType注解的方法允許您添加新類型的支持,包括指定默認選項。
比如,添加對GIF的支持,您可以增加GlideType方法:
@GlideExtension public class MyAppExtension { private static final RequestOptions DECODE_TYPE_GIF = decodeTypeOf(GifDrawable.class).lock();
@GlideType(GifDrawable.class)
public static void asGif(RequestBuilder
這樣將會產生一個包含如下方法的[RequestManager](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/RequestManager.html)實現(xiàn)。
public class GlideRequests extends RequesetManager {
public RequestBuilder
... }
然后,您可以使用生成的GlideApp類來調用自定義的方法:
GlideApp.with(fragment) .asGif() .load(url) .into(imageView);
由**GlideType**注解的方法必須將[RequestBuilder<T>](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/RequestBuilder.html)作為第一個參數(shù),<T>是符合GlideType注解提供的類型。注解方法必須定義在[GlideExtension](http://bumptech.github.io/glide/javadocs/400/com/bumptech/glide/annotation/GlideExtension.html)注解的類中并且要求是靜態(tài)的,返回類型為void。