最近在開發中遇到一個小問題,自定義的相冊,有大量的GIF圖片,通常Android的ImageView不能加載Gif圖片,如不做任何處理,那么加載到ImageView中的Gif只顯示第一幀,雖然只是顯示一幀,但是加載的是相當的慢,因為它需要decode整個GIF文件,通過imageview源碼看到,setImageUri(Uri uri),最后調用到如圖,其實就是BitmapFactory的decodefile,當然加載的時候你不能加載原圖,這時候你就得取縮略圖,可是縮略圖系統有沒有提供,所以GIF圖片還是要找方法處理
要想不全部加載,只能自己去寫一個decode第一幀的方法,但是那樣的話,加載大量的話,無論是從效率上、內存上都不是最好的選擇。
那樣只能從加載的框架上著手了,我們大多情況下都是想讓GIF圖片動起來,動起來的方法很多,什么glide,fresco,都支持GIF的播放,還有一些自定義封裝的庫也能對GIF做解碼,但是對于Android不是很牛逼的程序員來說,自己遇到的問題,肯定有人已經解決了,拿我現在的用的框架Fresco來說,里面有一個imagedecodeOptions 就對這個有了支持,很明白,意思為是否強制decode成靜態非動畫里的圖片圖2。
然后在我們設置Imagerequest的時候加上這個參數,OK,大功告成,但是我還是想知道它是怎么實現的,其實它的實現,都是基于它依賴的decode庫,
我們看到當判斷options.forceStaticImage之后,就return了,也就是不執行下面的decodeAllFrames,return回一個previewBitmap,可以理解為第一幀,作者比對了一下decodeallframe和createPreviewBitamp,簡單來說就是,一個是for循環,一個是單次,其他沒啥區別。
OK,今天就到這里,第一次寫這個,還請大家多多鼓勵,多多批評。
大吉大利!