fresco 加載GIF支持轉換靜態圖,第一幀

最近在開發中遇到一個小問題,自定義的相冊,有大量的GIF圖片,通常Android的ImageView不能加載Gif圖片,如不做任何處理,那么加載到ImageView中的Gif只顯示第一幀,雖然只是顯示一幀,但是加載的是相當的慢,因為它需要decode整個GIF文件,通過imageview源碼看到,setImageUri(Uri uri),最后調用到如圖,其實就是BitmapFactory的decodefile,當然加載的時候你不能加載原圖,這時候你就得取縮略圖,可是縮略圖系統有沒有提供,所以GIF圖片還是要找方法處理

圖1

要想不全部加載,只能自己去寫一個decode第一幀的方法,但是那樣的話,加載大量的話,無論是從效率上、內存上都不是最好的選擇。

那樣只能從加載的框架上著手了,我們大多情況下都是想讓GIF圖片動起來,動起來的方法很多,什么glide,fresco,都支持GIF的播放,還有一些自定義封裝的庫也能對GIF做解碼,但是對于Android不是很牛逼的程序員來說,自己遇到的問題,肯定有人已經解決了,拿我現在的用的框架Fresco來說,里面有一個imagedecodeOptions 就對這個有了支持,很明白,意思為是否強制decode成靜態非動畫里的圖片圖2。

圖2


圖3

然后在我們設置Imagerequest的時候加上這個參數,OK,大功告成,但是我還是想知道它是怎么實現的,其實它的實現,都是基于它依賴的decode庫,


圖4

我們看到當判斷options.forceStaticImage之后,就return了,也就是不執行下面的decodeAllFrames,return回一個previewBitmap,可以理解為第一幀,作者比對了一下decodeallframe和createPreviewBitamp,簡單來說就是,一個是for循環,一個是單次,其他沒啥區別。

OK,今天就到這里,第一次寫這個,還請大家多多鼓勵,多多批評。

大吉大利!


?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容