![Android App开发进阶与项目实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/44510109/b_44510109.jpg)
3.1.2 显示动图特效
GIF是Windows常见的图片格式,主要用来播放短小的动画。Android虽然号称支持PNG、JPG、GIF三种图片格式,但是并不支持直接播放GIF动图,如果在图像视图中加载一张GIF文件,那么只会显示GIF文件的第一帧图片。
若想在手机上显示GIF动图,则需八仙过海各显神通,具体的实现方式主要有三种:借助帧动画播放拆解后的组图,利用Movie类结合自定义控件播放动图,利用ImageDecoder结合动画图形播放动图。
1.借助帧动画播放拆解后的组图
在代码中将GIF文件分解为一系列图片数据,并获取每帧的持续时间,然后通过动画图形动态加载每帧图片。
从GIF文件中分解帧图片有现成的开源代码(具体参见本书源码animation模块的com\example\animation\util\GifImage.java),分解得到所有帧的组图,再通过帧动画技术显示GIF动图,详细的显示GIF图的示例代码如下:
(完整代码见animation\src\main\java\com\example\animation\GifActivity.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P82_7114.jpg?sign=1738951380-ee0I6T035sfiBdyK2p3KAoXOs1WH40lC-0-595a2e6ae64ee366849fbaf1f2f80bfb)
2.利用Movie类结合自定义控件播放动图
借助原生的Movie工具,先加载动图的资源图片,再将每帧图像绘制到视图画布,使之成为能够播放动图的自定义控件。动图视图的自定义代码如下:
(完整代码见animation\src\main\java\com\example\animation\widget\GifView.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P83_17354.jpg?sign=1738951380-rOtedxjMfyaRLmrlbypC1BGfYQZ5MnDM-0-7d6c0eed8db883305d53a0d5546ea482)
接着在布局文件中添加上面定义的GifView节点,并给活动代码添加如下加载方法,即可实现GIF动图的播放功能:
(完整代码见animation\src\main\java\com\example\animation\GifActivity.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P84_17357.jpg?sign=1738951380-u3XWYuTGkXTq1deYYB8v34Ev80Cg21Jf-0-68b7da1a9ac329e958f277198caa2497)
3.利用ImageDecoder结合动画图形播放动图
上述两种显示GIF动图的方法显然都不方便,毕竟GIF文件还是很流行的动图格式,因而Android从9.0开始增加了新的图像解码器ImageDecoder,该解码器支持直接读取GIF文件的图像数据,通过搭配具备动画特征的图形工具Animatable即可轻松实现在App中播放GIF动图。详细的演示代码如下所示:
(完整代码见animation\src\main\java\com\example\animation\GifActivity.java)
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P85_17359.jpg?sign=1738951380-YOlbVGsdo2jPBmYCWcCMRQgNDDMbRu6W-0-da5f3ee50eecafa0ebe91a0d36b450b8)
GIF文件的播放效果如图3-4和图3-5所示。图3-4为GIF动图播放开始时的画面,图3-5为GIF动图临近播放结束时的画面。
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P85_7130.jpg?sign=1738951380-PA5VgzteJ52MpFBv71XcXGyciWDEOFml-0-e3cb141068405a71a6cf8a2c0580fb34)
图3-4 GIF动画开始播放
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P85_7131.jpg?sign=1738951380-0arNpUuCadR8rkt0JHmukxSMNYhqu7hw-0-5d14409a676b7a042cf207a9e17d18c5)
图3-5 GIF动画播放结束
上面提到Android 9.0新增了ImageDecoder,该图像解码器不但支持播放GIF动图,也支持谷歌公司自研的WebP图片。WebP格式是谷歌公司在2010年推出的新一代图片格式,在压缩方面比JPEG格式更高效,且拥有相同的图像质量,同时WebP的图片大小比JPEG图片平均要小30%。另外,WebP也支持动图效果,ImageDecoder从WebP图片读取出Drawable对象之后即可转换成Animatable实例进行动画播放和停止播放的操作。
WebP格式的动图播放效果如图3-6和图3-7所示,其中图3-6为动图播放开头的界面、图3-7为动图播放结尾的界面,可见有一个足球向右边飞了过去。
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P86_7138.jpg?sign=1738951380-LkuUfIH9UxwvXfzemgUp2cipiE9mSvPI-0-b398649faa6837be19e5f635b7f8c5bf)
图3-6 WebP动图开始播放
![](https://epubservercos.yuewen.com/0C084D/23721623101012206/epubprivate/OEBPS/Images/Figure-P86_7139.jpg?sign=1738951380-LL7Nbz3LytrMacVoG2gKf67RQlzUzJBN-0-e651ab9f18b523fecc6710cbf6dc6abf)
图3-7 WebP动图即将结束