apng4android,Android-Apng动画播放

本文详细介绍了Android平台上Apng动画的播放流程,包括Apng的解析和渲染两个主要过程。Apng解析涉及ApngExact解压和ApngReader直接读取帧数据两种方法,而Apng渲染则包括消除、合成和绘制步骤。文章还提供了具体的代码实现,展示了如何在SurfaceView上播放Apng动画。
摘要由CSDN通过智能技术生成

1. 概述

在深入了解Apng动画播放之前,我们需要对Apng的结构有所了解,具体参见Apng动画介绍,对Apng的整体结构有所了解后,下面我们来讲讲Apng动画的播放,主要包括Apng解析和Apng渲染两个过程。

2. Apng动画播放流程

Apng动画播放流程包括Apng解析和Apng渲染两个过程,Apng解析主要有两种方法,下面我们将会介绍,而Apng渲染主要包括三个步骤:消除(dispose)、合成(blend)、绘制(draw),由此得到Apng动画播放流程图如下:

8114ed31c535

Apng动画播放流程

3. Apng的解析

Apng的解析主要是将Apng文件转化成Apng序列帧Frame-n,从上面的流程图可知,Apng文件的解析列出了两种方案,下面来分别说说:

1)Apng文件首先经过一个解压(ApngExact)的过程,生成png序列帧保存在本地,然后经过加载(LoadPng)处理生成序列帧Frame-n。

假设Apng动画文件总共有90帧,那么经过ApngExact处理后,会生成90张png序列帧保存在本地,每帧通过LoadPng处理生成Bitmap并供后面的Apng渲染使用。

2)Apng是一个独立的文件,我们自己编写读取Apng文件的代码类:ApngReader,当渲染第i帧时,通过ApngReader直接获取第i帧的Bitmap。

比较:

1)方案一是将Apng文件全部解压成png序列图片保存在本地,方案二是把Apng文件当做一个整体去处理,需要第几帧直接读取第几帧,并将该帧以Bitmap的形似保存到内存。

2)方案一解压得到的png图片在后面的渲染中需要转化成Bitamp,而方案二直接就获取了第几帧的Bitmap,相比于方案一,方案二减少了一个从SD卡读取png文件的操作。

4. Apng的渲染

方案一的具体实现大家可以参考github上面的一个项目apng-view,下面我们来讲讲方案二的具体实现,即ApngReader的具体实现。

1) 解析Apng的每一帧

我们是将整个文件放到一个buffer里面,并且通过RandomAccessFile、MappedByteBuffer来读取Apng的每一帧,ApngReader的构造函数如下:

public ApngReader(String apngFile) throws IOException, FormatNotSupportException {

RandomAccessFile f = new RandomAccessFile(apngFile, "r");

mBuffer = f.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, f.length());

f.close();

if (mBuffer.getInt() != PNG_SIG

&& mBuffer.getInt(4) != PNG_SIG_VER

&& mBuffer.getInt(8) != CODE_IHDR) {

throw new FormatNotSupportException("Not a png/apng file");

}

mChunk = new ApngMmapParserChunk(mBuffer);

reset();

}

下面来看看读取每一帧的方法:

/**

* get next frame control info & bitmap

*

* @return next frame control info, or null if no next FCTL chunk |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值