Glide4.0只播放一次Gif以及監(jiān)聽播放完成的實(shí)現(xiàn)方法

前言

這篇blog主要記錄一下最近剛好遇見的問題肄鸽,要實(shí)現(xiàn)一個gif只播放一次并且要在gif播放完之后回調(diào)一下的需求女淑,項(xiàng)目目前用的Glide是4.0版本,這個問題如果在Glide3.7上那么很好解決,網(wǎng)上有一大把的代碼示例勇哗,但是在Glide4.0的版本上壕曼,怎么搜都搜不到類似的苏研,只好自己想方法解決了,好了廢話不多說腮郊。

解決方法

一般在Glide3.7的時候是這樣解決的摹蘑,

Glide.with(this)
                .load("xxxurl")
                .listener(new RequestListener<Integer, GlideDrawable>() {

                    @Override
                    public boolean onException(Exception arg0, Integer arg1,
                            Target<GlideDrawable> arg2, boolean arg3) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource,
                            Integer model, Target<GlideDrawable> target,
                            boolean isFromMemoryCache, boolean isFirstResource) {
                        // 計(jì)算動畫時長
                        GifDrawable drawable = (GifDrawable) resource;
                        GifDecoder decoder = drawable.getDecoder();
                        for (int i = 0; i < drawable.getFrameCount(); i++) {
                            duration += decoder.getDelay(i);
                        }
                        //發(fā)送延時消息,通知動畫結(jié)束
                        handler.sendEmptyMessageDelayed(MESSAGE_SUCCESS,
                                duration);
                        return false;
                    }
                }) //僅僅加載一次gif動畫
                .into(new GlideDrawableImageViewTarget(imageview, 1));

但是在Glide4.0中伴榔,沒法再直接獲取GifDecoder對象了纹蝴,原因是因?yàn)?code>GlideDrawable不再提供這個方法了。
我這里是采用反射的方法獲取到GifDecoder變量的踪少,具體代碼如下:

 public static void loadOneTimeGif(Context context, Object model, final ImageView imageView, final GifListener gifListener) {
        Glide.with(context).asGif().load(model).listener(new RequestListener<GifDrawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                try {
                    Field gifStateField = GifDrawable.class.getDeclaredField("state");
                    gifStateField.setAccessible(true);
                    Class gifStateClass = Class.forName("com.bumptech.glide.load.resource.gif.GifDrawable$GifState");
                    Field gifFrameLoaderField = gifStateClass.getDeclaredField("frameLoader");
                    gifFrameLoaderField.setAccessible(true);
                    Class gifFrameLoaderClass = Class.forName("com.bumptech.glide.load.resource.gif.GifFrameLoader");
                    Field gifDecoderField = gifFrameLoaderClass.getDeclaredField("gifDecoder");
                    gifDecoderField.setAccessible(true);
                    Class gifDecoderClass = Class.forName("com.bumptech.glide.gifdecoder.GifDecoder");
                    Object gifDecoder = gifDecoderField.get(gifFrameLoaderField.get(gifStateField.get(resource)));
                    Method getDelayMethod = gifDecoderClass.getDeclaredMethod("getDelay", int.class);
                    getDelayMethod.setAccessible(true);
                    //設(shè)置只播放一次
                    resource.setLoopCount(1);
                    //獲得總幀數(shù)
                    int count = resource.getFrameCount();
                    int delay = 0;
                    for (int i = 0; i < count; i++) {
                        //計(jì)算每一幀所需要的時間進(jìn)行累加
                        delay += (int) getDelayMethod.invoke(gifDecoder, i);
                    }
                    imageView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            if (gifListener != null) {
                                gifListener.gifPlayComplete();
                            }
                        }
                    }, delay);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                return false;
            }
        }).into(imageView);
    }

    /**
     * Gif播放完畢回調(diào)
     */
    public interface GifListener {
        void gifPlayComplete();
    }

同時塘安,因?yàn)槲覀儾捎玫氖欠瓷洌詣e忘了在你的proguard-rules.pro中加上Glide的反混淆規(guī)則援奢,

#Glide
-keep class com.bumptech.glide.** {*;}

好了兼犯,這樣就大功告成啦~


如果覺得對你有所幫助,請點(diǎn)個贊集漾,謝謝切黔。你的鼓勵是我最大的動力。
歡迎關(guān)注EoniJJ的簡書

不定期與你分享關(guān)于Android開發(fā)的點(diǎn)點(diǎn)滴滴具篇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纬霞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驱显,更是在濱河造成了極大的恐慌诗芜,老刑警劉巖瞳抓,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伏恐,居然都是意外死亡孩哑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門翠桦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來横蜒,“玉大人,你說我怎么就攤上這事销凑〈陨危” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵闻鉴,是天一觀的道長茵乱。 經(jīng)常有香客問我,道長孟岛,這世上最難降的妖魔是什么瓶竭? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮渠羞,結(jié)果婚禮上斤贰,老公的妹妹穿的比我還像新娘。我一直安慰自己次询,他們只是感情好荧恍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屯吊,像睡著了一般送巡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盒卸,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天骗爆,我揣著相機(jī)與錄音,去河邊找鬼蔽介。 笑死摘投,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虹蓄。 我是一名探鬼主播犀呼,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薇组!你這毒婦竟也來了外臂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤律胀,失蹤者是張志新(化名)和其女友劉穎专钉,沒想到半個月后挑童,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體累铅,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跃须,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了娃兽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菇民。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖投储,靈堂內(nèi)的尸體忽然破棺而出第练,到底是詐尸還是另有隱情,我是刑警寧澤玛荞,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布娇掏,位于F島的核電站,受9級特大地震影響勋眯,放射性物質(zhì)發(fā)生泄漏婴梧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一客蹋、第九天 我趴在偏房一處隱蔽的房頂上張望塞蹭。 院中可真熱鬧,春花似錦讶坯、人聲如沸番电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漱办。三九已至,卻和暖如春婉烟,著一層夾襖步出監(jiān)牢的瞬間娩井,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工隅很, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撞牢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓叔营,卻偏偏與公主長得像屋彪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绒尊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容