文章目录
- Android开机动画压缩包zip,自制开机动画
- 1.Android加载压缩包原理
- 2.自制开机动画
Android开机动画压缩包zip,自制开机动画
1.Android加载压缩包原理
这里有个md文件我们看下
核心部分,
首先要创建一个文件叫做desc.txt,这是规定的,
## desc.txt format
The first line defines the general parameters of the animation:
//宽高,fps帧率
WIDTH HEIGHT FPS
* **WIDTH:** animation width (pixels)
* **HEIGHT:** animation height (pixels)
* **FPS:** frames per second, e.g. 60
It is followed by a number of rows of the form:
//TYPE 是一个字符 ,是一个格式,COUNT多少次要运行bootanimation PAUSE是否延迟暂停一帧,PATH 0-4
//TYPE COUNT PAUSE PATH这四个参数都要写上
TYPE COUNT PAUSE PATH [#RGBHEX [CLOCK1 [CLOCK2]]]
* **TYPE:** a single char indicating what type of animation segment this is:
//启动结束会被打断,
+ `p` -- this part will play unless interrupted by the end of the boot
//无论如何都不会被打断
+ `c` -- this part will play to completion, no matter what
//0代表直到开机boot完成为止
* **COUNT:** how many times to play the animation, or 0 to loop forever until boot is complete
* **PAUSE:** number of FRAMES to delay after this part ends
* **PATH:** directory in which to find the frames for this part (e.g. `part0`)
* **RGBHEX:** _(OPTIONAL)_ a background color, specified as `#RRGGBB`
//坐标参数clock
* **CLOCK1, CLOCK2:** _(OPTIONAL)_ the coordinates at which to draw the current time (for watches):
+ If only `CLOCK1` is provided it is the y-coordinate of the clock and the x-coordinate
defaults to `c`
+ If both `CLOCK1` and `CLOCK2` are provided then `CLOCK1` is the x-coordinate and `CLOCK2` is
the y-coodinate
+ Values can be either a positive integer, a negative integer, or `c`
- `c` -- will centre the text
- `n` -- will position the text n pixels from the start; left edge for x-axis, bottom edge
for y-axis
- `-n` -- will position the text n pixels from the end; right edge for x-axis, top edge
for y-axis
- Examples:
* `-24` or `c -24` will position the text 24 pixels from the top of the screen,
centred horizontally
* `16 c` will position the text 16 pixels from the left of the screen, centred
vertically
* `-32 32` will position the text such that the bottom right corner is 32 pixels above
and 32 pixels left of the edges of the screen
There is also a special TYPE, `$SYSTEM`, that loads `/system/media/bootanimation.zip`
and plays that.
图片路径part0,表示图片文件夹,里面都是一张张的图片文件
## zipfile paths
The system selects a boot animation zipfile from the following locations, in order:
/system/media/bootanimation-encrypted.zip (if getprop("vold.decrypt") = '1')
/system/media/bootanimation.zip
/oem/media/bootanimation.zip
## zipfile layout
The `bootanimation.zip` archive file includes:
desc.txt - a text file
part0 \
part1 \ directories full of PNG frames
... /
partN /
如果我们预制了zip的文件,那么代码就会走movie
加载动画,解析zip里面的文件
BootAnimation::Animation* BootAnimation::loadAnimation(const String8& fn)
{
if (mLoadedFiles.indexOf(fn) >= 0) {
SLOGE("File \"%s\" is already loaded. Cyclic ref is not allowed",
fn.string());
return nullptr;
}
ZipFileRO *zip = ZipFileRO::open(fn);
if (zip == nullptr) {
SLOGE("Failed to open animation zip \"%s\": %s",
fn.string(), strerror(errno));
return nullptr;
}
Animation *animation = new Animation;
animation->fileName = fn;
animation->zip = zip;
animation->clockFont.map = nullptr;
mLoadedFiles.add(animation->fileName);
//解析desc.txt文件,
parseAnimationDesc(*animation);
if (!preloadZip(*animation)) {
return nullptr;
}
mLoadedFiles.remove(fn);
return animation;
}
读取描述文件
这四个参数是必须要写的
把文件夹的每一帧图片加载进来,
然后就到一个关键方法,播放动画。
他会去执行每一个part文件夹,一帧一帧的绘制图片纹理。
2.自制开机动画
准备资源
编写desc.txt文件规则
第一行是宽高,帧率fps
有多少个part文件夹就写多少行数,
c 无论如何都会执行完当前的这个part部分,保证动画的连续性,1 循环一次,只播放一次, 0 停留的帧数,
#ffee00代表颜色值,c c代表位置,横纵坐标,都是center居中。
1080 360 60
c 1 0 part0 #ffee00 c c
c 0 0 part1 #ffee00 c c
c 1 0 part2 #ffee00 c c
c 1 1 part3 #ffee00 c c
c 1 0 part4 #ffee00 c c
打包zip的压缩包
zip -r -X -Z store bootanimation part*/* desc.txt
执行命令
如下图
预制到/system/media
把 bootanimation.zip 动画文件移动到 我们自定义的product 文件中。
配置文件 test.mk中添加如下内容
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/bootanimation.zip:/system/media/bootanimation.zip
PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST +=\
/system/media/bootanimation.zip
然后测试运行