今天給大家分享一下Glide的一些使用技巧。Glide應(yīng)該是Android APP中使用最為廣泛的圖片加載框架了,如絲般的順滑滾動(dòng)以及方便的鏈?zhǔn)秸{(diào)用為廣大開發(fā)者所喜愛。但是開發(fā)中,我們總能遇上一些不太普遍的需求,比如列表中顯示視頻縮略圖、顯示音頻的封面圖、apk的圖標(biāo)等等,或者更奇葩的需求。這些場景使用框架默認(rèn)的調(diào)用無法滿足。
下面給大家分享一些處理以上需求的方法和技巧。
以下代碼中Glide使用的均為4.X版本。尤其是自定義加載部分,4.X版本較之前版本API有些許改動(dòng),請注意。
加載視頻縮略圖
對于視頻縮略圖的加載,Glide是自帶的,只是很多人并不知道,通過RequestOption可以進(jìn)行設(shè)置加載。如下代碼:
配置GlideModule用于生成GlideApp
@GlideModule
public class MediaGlideModule extends AppGlideModule {
@Overridepublic void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {}}
復(fù)制代碼然后使用GlideApp加載視頻縮略圖
GlideApp.with(context).setDefaultRequestOptions(
new RequestOptions().frame(frameTimeMicros).centerCrop().error(defaultHolder).placeholder(defaultHolder)).load(path).into(view);
復(fù)制代碼注意: 方法frame(long frameTimeMicros)需要指定你要獲取的時(shí)間點(diǎn),傳入的參數(shù)是微秒,如果要獲取2秒處的幀畫面即要傳入2000000.
Glide的自定義加載
上面給大家展示了如何使用Glide提供的API加載視頻縮略圖。但是如果我們想使用Glide去加載更加個(gè)性化的數(shù)據(jù)怎么做呢?比如在一個(gè)音樂列表里面要展示所有的音樂封面圖,Glide可沒提供這種API啊,咋整呢?這就需要用到Glide的自定義加載了。強(qiáng)大的Glide充分考慮到了用戶的個(gè)性化使用。你可以自定義數(shù)據(jù)流的獲取過程,然后回調(diào)給Glide就OK了,其他的什么任務(wù)的調(diào)度和分發(fā)以及緩存依舊是Glide幫你做,這塊無需關(guān)心。
Glide的自定義加載總結(jié)為以下過程:
定義一個(gè)Model類用于包裝需要加載的數(shù)據(jù)定義一個(gè)Key的實(shí)現(xiàn)類,用于實(shí)現(xiàn)第一步的Model中的數(shù)據(jù)的簽名用于區(qū)分緩存定義一個(gè)DataFetcher的實(shí)現(xiàn)類,用于告訴Glide音頻封面如何加載,并把加載結(jié)果回調(diào)出去定義一個(gè)ModelLoader的實(shí)現(xiàn)類用于包裝DataFetcher定義一個(gè)ModelLoaderFactory的實(shí)現(xiàn)類用于生成ModelLoader實(shí)例將自定義加載配置到AppGlideModule中看著好像挺麻煩的,是吧。其實(shí)代碼沒多少,如下:
- 第一步 定義一個(gè)包裝數(shù)據(jù)的Model類AudioCover
public class AudioCover {
final String path;
public AudioCover(String path) {
this.path = path;}
}
復(fù)制代碼- 第二部 定義一個(gè)Key的實(shí)現(xiàn)類
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);}
}
復(fù)制代碼- 第三部 定義一個(gè)DataFetcher的實(shí)現(xiàn)類(關(guān)鍵代碼-處理封面的獲取并回調(diào)給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;}
}
復(fù)制代碼注意: 方法loadData()是同步的方法,直接處理獲取即可。
- 第四部 定義一個(gè)ModelLoader的實(shí)現(xiàn)類包裝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;}
}
復(fù)制代碼- 第五步 定義一個(gè)ModelLoaderFactory的實(shí)現(xiàn)類用于生成ModelLoader的實(shí)例
public class AudioCoverLoaderFactory implements ModelLoaderFactory<AudioCover,InputStream> {
@NonNull@Overridepublic ModelLoader<AudioCover, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {
return new AudioModuleLoader();}
@Overridepublic void teardown() {}
}
復(fù)制代碼- 第六步 將自定義加載配置到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());}}
復(fù)制代碼然后就可以愉快的使用了
GlideApp.with(context).load(
new AudioCover(path)).placeholder(defaultHolder).error(defaultHolder).into(view);
復(fù)制代碼通過Glide的自定義加載可以實(shí)現(xiàn)很多Glide之外的數(shù)據(jù)流加載,加載部分給了充分的自由度,比如你還可以自定義一個(gè)用于獲取apk圖標(biāo)加載,又或者你可以在加載時(shí)請求某些數(shù)據(jù)接口而實(shí)現(xiàn)更為復(fù)雜的加載過程等等。
以上就是Glide的自定義加載使用,有需要的可以參考一下。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的你真的会使用Glide吗?——Glide的高级用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。