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,主要是要选成存储方式。

更多相关文章

  1. Android下PreferenceScreen 加载流程
  2. Android属性动画Property Animation系列二之ObjectAnimator
  3. Android(安卓)使用ActivityOptions实现Activity转场动画
  4. 【Android】android:padding属性设置对ImageButton无效问题
  5. android通知栏Notification
  6. android 锁屏时,不运行锁屏程序
  7. android 基本概念和一些术语
  8. android 显示特殊符号
  9. android中menu的使用

随机推荐

  1. Android NDK开发学习(四)
  2. No.10 LVM快照的特点
  3. Android 适配7.0拍照、图库、裁剪
  4. android rotate
  5. Google将推出Android手机版Voice应用程序
  6. Android单元测试框架 Robolectric
  7. android selinux权限, Permission denied,
  8. 在模拟器上安装软件
  9. Linux 环境下实战 Rsync 备份工具及配置
  10. 一款霸榜 GitHub 的开源 Linux 资源监视