大家好,又见面了,我是你们的朋友全栈君。
android开机动画详细分析可以参见http://blog.csdn.net/luoshengyang/article/details/7691321
引用老罗的文章,写的太好了。
以下介绍一些相关的点。
这里的开机动画指的是以bootanimation.zip方式存在,不包括BootVideo这种方式。
1、开机动画路径:
bootanimation.zip路径有两个: a、”/data/local/bootanimation.zip”
b、”/system/media/bootanimation.zip”
标准流程会以a路径优先,也就是/data分区下的那个,没有的话才是会加载、/system分区下的动画。也就是可以再/data下就更新开机动画,恢复出厂会回到原本的/system下的动画。
2、bootanimation.zip内容:
“desc.txt”:用来描述用户自定义的开机动画是如何显示的。
desc.txt的内容格式如下面的例子所示:
1280 720 1
p 1 1 part0
p 0 1 part1
第一行的三个数字分别表示开机动画在屏幕中的显示宽度、高度以及帧速(fps)。剩余的每一行都用来描述一个动画片断,这些行必须要以字符“p”来开头,后面紧跟着两个数字以及一个文件目录路径名称。
第一个数字表示一个片断的循环显示次数,如果它的值等于0,那么就表示无限循环地显示该动画片断。
第二个数字表示每一个片断在两次循环显示之间的时间间隔。这个时间间隔是以一个帧的时间为单位的。
文件目录下面保存的是一系列png文件,这些png文件会被依次显示在屏幕中。
3、动画的Start和stop控制:
动画的开始与结束是由属性值控制的,由/system/bin/surfaceflinger来控制,然后相关的动画处理程序为/system/bin/bootanimation,在init.rc中指定。
a、bootanimation 需要由property_set(“ctl.start”, “bootanim”);来启动,由property_set(“ctl.stop”, “bootanim”);来关掉进程。
b、“service.bootanim.exit”:这个属性在bootanimation进程里会周期检查,=1时就退出动画,这里=0表示要播放动画。
启动和关闭的地方在frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp中调用:
c、property_get(“debug.sf.nobootanimation”, value, “0”);该字段如果=1,则不会显示动画。
d、有时希望能等待开机动画全部帧播放完才进入Launcher,可以去修改frameworks\base\cmds\bootanimation.cpp中bool BootAnimation::movie()函数下的这个部分,将part.playUntilComplete设置为1即可。
else if (sscanf(l, " %c %d %d %s", &pathType, &count, &pause, path) == 4) {
//LOGD("> type=%c, count=%d, pause=%d, path=%s", pathType, count, pause, path);
Animation::Part part;
//part.playUntilComplete = pathType == 'c';//edify by wusc to wait for bootanimation complete
part.playUntilComplete = 1;//edify by wusc to wait for bootanimation complete
part.count = count;
part.pause = pause;
part.path = path;
animation.parts.add(part);
}
另外还可以将“desc.txt”中的p改为c,然后重新打包即可。从上面的代码也可以看出 //part.playUntilComplete = pathType == 'c';
e、到bool BootAnimation::movie()函数,动画是在播放了,而且还在循环检测是否退出,即checkExit()。checkExit()函数中检测到”service.bootanim.exit”属性变为1了,会调用requestExit();请求退出。
f、另外一个需要注意的地方:在bool BootAnimation::movie()函数下,每当显示完成一个png图片之后,都要将变量frameDuration的值从纳秒转换为毫秒,然后调用usleep函数,以保证每一个png图片,即每一帧动画都按照预先指定好的速度来显示。
注意,函数usleep指定的睡眠时间只能精确到毫秒,因此,如果预先指定的帧显示时间小于1毫秒,那么BootAnimation类的成员函数movie是无法精确地控制地每一帧的显示时间的。
4、重新打包制作开机动画的方法
其实这个没什么好说的,就是普通的打包成zip,主要是要选成存储方式。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/146321.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...