今天給大家分享一下Glide的一些使用技巧。Glide應該是Android APP中使用最為廣泛的圖片加載框架了,如絲般的順滑滾動以及方便的鏈式調用為廣大開發者所喜愛。但是開發中,我們總能遇上一些不太普遍的需求,比如列表中顯示視頻縮略圖、顯示音頻的封面圖、apk的圖標等等,或者更奇葩的需求。這些場景使用框架默認的調用無法滿足。
下面給大家分享一些處理以上需求的方法和技巧。
以下代碼中Glide使用的均為4.X版本。尤其是自定義加載部分,4.X版本較之前版本API有些許改動,請注意。
加載視頻縮略圖
對于視頻縮略圖的加載,Glide是自帶的,只是很多人并不知道,通過RequestOption可以進行設置加載。如下代碼:
配置GlideModule用于生成GlideApp
@GlideModule
public class MediaGlideModule extends AppGlideModule {
@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {}}
復制代碼然后使用GlideApp加載視頻縮略圖
GlideApp.with(context).setDefaultRequestOptions(
new RequestOptions().frame(frameTimeMicros).centerCrop().error(defaultHolder).placeholder(defaultHolder)).load(path).into(view);
復制代碼注意: 方法frame(long frameTimeMicros)需要指定你要獲取的時間點,傳入的參數是微秒,如果要獲取2秒處的幀畫面即要傳入2000000.
Glide的自定義加載
上面給大家展示了如何使用Glide提供的API加載視頻縮略圖。但是如果我們想使用Glide去加載更加個性化的數據怎么做呢?比如在一個音樂列表里面要展示所有的音樂封面圖,Glide可沒提供這種API啊,咋整呢?這就需要用到Glide的自定義加載了。強大的Glide充分考慮到了用戶的個性化使用。你可以自定義數據流的獲取過程,然后回調給Glide就OK了,其他的什么任務的調度和分發以及緩存依舊是Glide幫你做,這塊無需關心。
Glide的自定義加載總結為以下過程:
定義一個Model類用于包裝需要加載的數據定義一個Key的實現類,用于實現第一步的Model中的數據的簽名用于區分緩存定義一個DataFetcher的實現類,用于告訴Glide音頻封面如何加載,并把加載結果回調出去定義一個ModelLoader的實現類用于包裝DataFetcher定義一個ModelLoaderFactory的實現類用于生成ModelLoader實例將自定義加載配置到AppGlideModule中看著好像挺麻煩的,是吧。其實代碼沒多少,如下:
- 第一步 定義一個包裝數據的Model類AudioCover
public class AudioCover {
final String path;
public AudioCover(String path) {
this.path = path;}
}
復制代碼public class AudioCoverSignature implements Key {
private final File file;
private StringBuilder stringBuilder;
public AudioCoverSignature(String path) {
this.file =
new File(path);stringBuilder =
new StringBuilder();}
@Override public void updateDiskCacheKey(MessageDigest messageDigest) {stringBuilder.append(file.lastModified()).append(file.getAbsolutePath());
byte[] bs = stringBuilder.toString().getBytes();messageDigest.update(bs,
0, bs.length);}
}
復制代碼- 第三部 定義一個DataFetcher的實現類(關鍵代碼-處理封面的獲取并回調給Glide)
public class AudioCoverFetcher implements DataFetcher<InputStream> {
private final AudioCover model;
private MediaMetadataRetriever mRetriever;
public AudioCoverFetcher(AudioCover model) {
this.model = model;}
public AudioCover getModel() {
return model;}
@Overridepublic void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {mRetriever =
new MediaMetadataRetriever();
try {mRetriever.setDataSource(model.path);
byte[] picture = mRetriever.getEmbeddedPicture();
if (picture !=
null) {callback.onDataReady(
new ByteArrayInputStream(picture));}
else {callback.onLoadFailed(
new Exception(
"load audio cover fail"));}}
catch (Exception e){e.printStackTrace();}}
@Override public void cleanup() {mRetriever.release();}
@Override public void cancel() {}
@NonNull@Overridepublic Class<InputStream> getDataClass() {
return InputStream.class;}
@NonNull@Overridepublic DataSource getDataSource() {
return DataSource.LOCAL;}
}
復制代碼注意: 方法loadData()是同步的方法,直接處理獲取即可。
- 第四部 定義一個ModelLoader的實現類包裝DataFetcher
public class AudioModuleLoader implements ModelLoader<AudioCover, InputStream> {
@Nullable@Overridepublic LoadData<InputStream> buildLoadData(@NonNull AudioCover audioCover, int width, int height, @NonNull Options options) {
return new LoadData<>(
new AudioCoverSignature(audioCover.path),
new AudioCoverFetcher(audioCover));}
@Overridepublic boolean handles(@NonNull AudioCover audioCover) {
return true;}
}
復制代碼- 第五步 定義一個ModelLoaderFactory的實現類用于生成ModelLoader的實例
public class AudioCoverLoaderFactory implements ModelLoaderFactory<AudioCover,InputStream> {
@NonNull@Overridepublic ModelLoader<AudioCover, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {
return new AudioModuleLoader();}
@Overridepublic void teardown() {}
}
復制代碼- 第六步 將自定義加載配置到GlideModule中
@GlideModule
public class MediaGlideModule extends AppGlideModule {
@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
super.registerComponents(context, glide, registry);registry.append(AudioCover.class,InputStream.class,
new AudioCoverLoaderFactory());}}
復制代碼然后就可以愉快的使用了
GlideApp.with(context).load(
new AudioCover(path)).placeholder(defaultHolder).error(defaultHolder).into(view);
復制代碼通過Glide的自定義加載可以實現很多Glide之外的數據流加載,加載部分給了充分的自由度,比如你還可以自定義一個用于獲取apk圖標加載,又或者你可以在加載時請求某些數據接口而實現更為復雜的加載過程等等。
以上就是Glide的自定義加載使用,有需要的可以參考一下。
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的你真的会使用Glide吗?——Glide的高级用法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。