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圖壓根不動
第二點要注意的是初始化的時候在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的問題就解決了