最近在开发中遇到一个小问题,自定义的相册,有大量的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,今天就到这里,第一次写这个,还请大家多多鼓励,多多批评。
大吉大利!