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)
2.利用Movie类结合自定义控件播放动图
借助原生的Movie工具,先加载动图的资源图片,再将每帧图像绘制到视图画布,使之成为能够播放动图的自定义控件。动图视图的自定义代码如下:
(完整代码见animation\src\main\java\com\example\animation\widget\GifView.java)
接着在布局文件中添加上面定义的GifView节点,并给活动代码添加如下加载方法,即可实现GIF动图的播放功能:
(完整代码见animation\src\main\java\com\example\animation\GifActivity.java)
3.利用ImageDecoder结合动画图形播放动图
上述两种显示GIF动图的方法显然都不方便,毕竟GIF文件还是很流行的动图格式,因而Android从9.0开始增加了新的图像解码器ImageDecoder,该解码器支持直接读取GIF文件的图像数据,通过搭配具备动画特征的图形工具Animatable即可轻松实现在App中播放GIF动图。详细的演示代码如下所示:
(完整代码见animation\src\main\java\com\example\animation\GifActivity.java)
GIF文件的播放效果如图3-4和图3-5所示。图3-4为GIF动图播放开始时的画面,图3-5为GIF动图临近播放结束时的画面。
图3-4 GIF动画开始播放
图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为动图播放结尾的界面,可见有一个足球向右边飞了过去。
图3-6 WebP动图开始播放
图3-7 WebP动图即将结束