說明
最近項(xiàng)目中有使用到gif動(dòng)畫速侈,加上本身已經(jīng)引入了Glide 3.7.0(支持gif)庫显设,所以便用Glide來加載了僻澎;但在使用過程中還是遇到了不少困難废封, 在此記錄下州泊,希望可以給遇到類似問題的你一些思考和建議。
簡(jiǎn)單使用
如果你還不了解Glide庫漂洋, 可移步https://github.com/bumptech/glide
同加載普通圖片一樣遥皂,使用如下代碼即可加載gif動(dòng)畫
Glide.with(this).load(...).asGif().into(...)
需要注意的是如果加載的圖片不是gif,則asGif()會(huì)報(bào)錯(cuò)刽漂, 當(dāng)然演训,asGif()不寫也是可以正常加載的。
Gif動(dòng)畫播放的一些控制
- 有的時(shí)候我們需要控制動(dòng)畫的播放次數(shù)贝咙,而默認(rèn)的加載則是循環(huán)播放的仇祭,而Glide也沒有開放單獨(dú)的api接口用來控制gif,這時(shí)可以通過
GlideDrawableImageViewTarget(view, int)
來實(shí)現(xiàn)颈畸, 其中第二個(gè)參數(shù)表示播放的次數(shù):
Glide.with(this).load(...).into(new GlideDrawableImageViewTarget(iv, 1));
- 如果需要監(jiān)聽動(dòng)畫播放完成呢乌奇?我的思路是添加一個(gè)
RequestListener
,獲取加載的gif的播放時(shí)間time眯娱,延時(shí)time時(shí)長(zhǎng)后發(fā)起播放結(jié)束消息礁苗,大致可以實(shí)現(xiàn)播放的監(jiān)聽。完整例子如下:
Glide.with(this).load(R.drawable.third_animation).listener(new RequestListener<Integer, GlideDrawable>() {
@Override
public boolean onException(Exception e, Integer model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, Integer model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
Observable.just(resource)
.flatMap(new Func1<GlideDrawable, Observable<?>>() {
@Override
public Observable<?> call(GlideDrawable glideDrawable) {
int duration = 0;
try {
GifDrawable gifDrawable = (GifDrawable) glideDrawable;
GifDecoder decoder = gifDrawable.getDecoder();
for (int i = 0; i < gifDrawable.getFrameCount(); i++) {
duration += decoder.getDelay(i); }
} catch (Throwable e) {
}
return Observable.just(null).delay(duration, TimeUnit.MILLISECONDS);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
// 加載完成后的處理...
}
});
return false;
}}).into(new GlideDrawableImageViewTarget(welcomeGif2, 1));
別再評(píng)論說代碼報(bào)錯(cuò)了
好多個(gè)同學(xué)都留言說代碼有問題徙缴,GlideDrawableImageViewTarget
報(bào)錯(cuò)...遇到錯(cuò)誤先排查下自己代碼有沒有問題...附代碼截圖: