1. 程式人生 > >android使用Fresco顯示gif圖並控制動畫,解決動畫為空null的問題

android使用Fresco顯示gif圖並控制動畫,解決動畫為空null的問題

前天專案中用到gif圖做支付狀態顯示,支付中、支付失敗或成功這3個gif。本來打算要美工(當著美工的面要稱呼他們叫UI設計師)做幀圖片,然後自己做動畫的,後來發現專案裡用到了Fresco(做頭像用的,我也是剛接觸專案一個月,之前不知道)。並且Fresco自帶支援gif和webP的。然後就用起來了,下邊是我遇到的問題,跟大家分享一下

使用方法,這個就不贅述了,Fresco的api文件寫的非常好,而且直接中文版,不用英語二把刀去查github和stackoverflow了。

大致就是導包,初始化,xml佈局,程式碼實現四步。需要注意的幾點是:導包時如果像我一樣用到了gif

一定要匯入下邊這個 compile 'com.facebook.fresco:animated-gif:0.12.0',否則gif圖壓根不動

,當時我都一臉懵逼了,各種百度各種google花了整整一下午加一晚上時間。最後從頭去讀Fresco的API才找到這個原因,順便吐槽一下網上Fresco的資料也太少了吧,所以我寫這個也是造福大眾大笑

第二點要注意的是初始化的時候在oncreate中,我是寫到application的oncreate中的,看別人帖子說要初始化在activity的話貌似必須寫到setcontentview方法前,我也沒試,反正application的oncreate沒有setcontentview。

第三點是佈局裡邊SimpleDraweeView的寬高不支援wrapcontent,這個在api和其他帖子都有說,包括xmlns的新增都說的很清楚,就不給大家貼了。

第四點和第一點都是非常重要的,至少對我來說是的。下邊大篇幅介紹,要使用animatable的話按照Fresco的文件應該是這樣

Animatable animatable = mSimpleDraweeView.getController().getAnimatable();
if (animatable != null) {
  animatable.start();
  // later
  animatable.stop();
}

然而我這使用中發現不論如何,我取到的animtable一直都是空的null。怕getanimtable時候controller沒載入完gif,還寫了執行緒等一段時間再get,但是也不可以。最後我是這麼解決的。獨家祕方

宣告全域性變數animtable,然後新增文件中的這個方法

ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
    @Override
    public void onFinalImageSet(
        String id,
        @Nullable ImageInfo imageInfo,
        @Nullable Animatable anim) {
        if (anim != null) {
          // 其他控制邏輯
          anim.start();
        }
    }
};

實現將anim賦值給animtable就有值了,下邊是我的程式碼

controllerListener = new BaseControllerListener<ImageInfo>() {
    @Override
public void onFinalImageSet(
            String id,
@Nullable ImageInfo imageInfo,
@Nullable Animatable anim) {
        if (anim != null) {
            // 其他控制邏輯
anim.start();
animatable = anim;
}
    }
};

mSimpleDraweeView.getController().getAnimatable()=null的問題就解決了