转自  https://blog.csdn.net/u010753159/article/details/51356331

1 desc.txt文件格式分析

desc.txt文件由若干行组成,每一行代表一种描述。下面以一个具体的例子为例,具体说明

[html] view plaincopy
  1. 480 640 20
  2. p 1 0 folder1
  3. p 2 20 folder2
  4. c 0 0 folder3
  5. c 1 0 folder4

第1行用来描述开机动画在屏幕显示的大小及速度。具体为:开机动画的宽度为480个像素,高度为640个像素,显示频率为每秒20帧,即每帧显示1/20秒。

下面的每一行代表一个片段,显示的时候会按照顺序从上到下依次显示。第1个字符为片段类型,有'c'和'p'两种,两者的区别后面会结合代码说明。

第2个数字为该片段重复显示的次数,如果为‘0’,表示会无限重复显示;第3个数字为两次显示之间的间隔,单位为第一行中定义的每帧显示的时间;第4个字符串为该片段所在的文件夹,一个片段可以由多个png图片组成,都存放在folder文件夹中。

“p 1 0 folder1”代表该片段显示1次,与下一个片段间隔0s,该片段的显示图片路径为bootanimation.zip/folder1。

“p 2 20 folder2”代表该片段显示2次,且两次之间显示的间隔为20*(1/20)=1s,与下一个片段间隔20*(1/20)=1s,该片段的显示图片路径为bootanimation.zip/folder2。

“c 0 0 folder3”代表该片段无限循环显示,且两次显示的间隔为0s,与下一个片段间隔0s,该片段的显示图路径为bootanimation.zip/folder3。

“c 1 10 folder4”代表该片段显示1次,显示后暂停10*(1/20)=0.5s,该片段的显示图路径为bootanimation.zip/folder4。

2 "p"片段和“c”片段的区别

在早期Android版本中只有“p”片段,且movie()中的显示代码如下:

[html] view plaincopy
  1. for (int i=0 ; i<pcount && !exitPending() ; i++) {
  2. const Animation::Part& part(animation.parts[i]);
  3. const size_t fcount = part.frames.size();
  4. glBindTexture(GL_TEXTURE_2D, 0);
  5. for (int r=0 ; !part.count || r<part.count ; r++) {
  6. for (int j=0 ; j<fcount && !exitPending(); j++) {
  7. const Animation::Frame& frame(part.frames[j]);
  8. .......
  9. .....
  10. }

里面的主要参数和函数说吗如下:

pcount---显示片段的数量,比如上面的例子,pcount=4

p.count---该片段的重复显示次数。

fcount---该片段中png图片的数量
exitPending()---如果SurfaceFlinger服务通知bootanimation停止显示动画,则该函数返回值为true,否则为false。

第一个for循环用于顺序显示所有片段,第二个for循环用于重复显示该片段,第三个for循环用于顺序显示该片段中所有的png图片。

分析代码,可知:若exitPending()返回值为true,即SurfaceFlinger服务要求bootanimation停止显示动画,则不管当前显示到哪个片段或png图片,都会导致退出for循环,从而停止开机动画的显示。

在Android5.1中,加入了“c”片段。对与以"c"标识的片段,即使exitPending()返回值为true,也会继续显示。

我们分析一下源码,首先看一下movie()中解析desc.txt的代码:

[html] view plaincopy
  1. // Parse the description file
  2. for (;;) {
  3. ......
  4. if (sscanf(l, "%d %d %d %d", &width, &height, &fps, &flg) >= 3) {
  5. animation.width = width;
  6. animation.height = height;
  7. animation.fps = fps;
  8. }
  9. else if (sscanf(l, " %c %d %d %s #%6s", &pathType, &count, &pause, path, color) >= 4) {
  10. Animation::Part part;
  11. part.playUntilComplete = pathType == 'c';
  12. part.count = count;
  13. part.pause = pause;
  14. part.path = path;
  15. part.audioFile = NULL;
  16. if (!parseColor(color, part.backgroundColor)) {
  17. ALOGE("> invalid color '#%s'", color);
  18. part.backgroundColor[0] = 0.0f;
  19. part.backgroundColor[1] = 0.0f;
  20. part.backgroundColor[2] = 0.0f;
  21. }
  22. animation.parts.add(part);
  23. }
  24. s = ++endl;
  25. }

可以看到,如果pathType==‘c’,part.playUntilComplete等于true,否则为false。接着,看一下显示代码:

[html] view plaincopy
  1. for (size_t i=0 ; i<pcount ; i++) {
  2. const Animation::Part& part(animation.parts[i]);
  3. const size_t fcount = part.frames.size();
  4. glBindTexture(GL_TEXTURE_2D, 0);
  5. for (int r=0 ; !part.count || r<part.count ; r++) {
  6. // Exit any non playuntil complete parts immediately
  7. if(exitPending() && !part.playUntilComplete)
  8. break;
  9. ......
  10. for (size_t j=0 ; j<fcount && (!exitPending() || part.playUntilComplete) ; j++) {
  11. ......
  12. checkExit();
  13. }
  14. usleep(part.pause * ns2us(frameDuration));
  15. // For infinite parts, we've now played them at least once, so perhaps exit
  16. if(exitPending() && !part.count)
  17. break;
  18. }
  19. ......
  20. }

可以看到,如果exitPending()返回值为true且part.playUntilComplete=false,则会break。即:当SurfaceFlinger服务要求bootanimation停止显示动画时,以‘p’标识的片段会停止,而以'c'标识的片段会继续显示。这就是两者之间的主要区别。

这里有个问题:重复循环显示的'c'标识片段,会不受任何约束的一直显示下去,这显然是不合适的。
于是在第二个for循环体最后,有如下代码:

[html] view plaincopy
  1. // For infinite parts, we've now played them at least once, so perhaps exit
  2. if(exitPending() && !part.count)
  3. break;

意思是,如果检测到SurfaceFlinger服务要求bootanimation停止显示,且该片段的显示次数为'0',即重复循环显示,则会break停止显示。

我猜想"c"标识的意思是continue,即:即使SurfaceFlinger要求bootanimation停止动画,bootanimation也不会立刻停止动画,它会等c标识片段都显示完毕后,再停止。

这样,我们可以利用'c'和'p'片段的区别,设计出更灵活的开机动画。

开机动画desc.txt描述文件的分析相关推荐

  1. android 开机动画 desc.txt,求安卓开机动画包里desc.txt的格式解释!

    匿名用户 1级 2017-01-17 回答 首先"#"是程序解释说明符,#后面的内容是解释说明,在程序中不起作用. 你要问的是关于andriod启动界面动画的相关内容.下面几个文件 ...

  2. Android 更换开机logo和开机动画

    Android版本:8.1 一丶开机logo的替换 开机logo有kernel logo和uboot logo两个 如何找到对应的图片? 确认当前项目的设备使用的是哪种尺寸的logo 一般在对应项目的 ...

  3. rk3568 修改开机动画

    rk3568 修改开机动画 bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间. 文章目录 rk3568 ...

  4. android开机动画视频教程,【Android开机动画制作教程】开机动画文件组成及其详解释疑!...

    [开机动画位置] 安卓原版系统开机动画位置: system/media/bootanimation.zip或者data/local/bootanimation.zip 这两处的区别在于动画放在syst ...

  5. Android系统手机开机画面各个阶段代码执行流程分析(Part2)

    3. 第三个开机画面的显示过程 第三个开机画面是由应用程序bootanimation来负责显示的.应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,如下所示: servi ...

  6. Android 开机动画流程介绍

    前言 简单介绍了安卓开机动画流程 流程 [开机动画启动流程]: // Bootanim.rc (frameworks\base\cmds\bootanimation)service bootanim ...

  7. 安卓手机开机动画制作修改教程

    1. 首先要明白,开机动画是一个zip文件,首先是读取/data/local/bootanimation.zip,如果在那里找不到,     就去读取默认的/system/media/bootanim ...

  8. Android 开机动画

    1.     介绍 android开机画面由三部分组成,第一部分在bootloader启动时显示,第二部分在启动kernel时显示,第三部分在系统启动时(bootanimation)显示(动画) 2. ...

  9. MTK平台修改开机动画,开机logo

    修改开机logo 找到目录 trunk/mediatek/custom/common/lk/logo/ 该目录下面有很多的文件夹,都是在不同分辨率下面的logo 要修改的话就看需要修改哪个分辨律下面的 ...

  10. android开机动画多长时间_android开关机动画和铃声配置

    12. 分区修改 A 修改分区文件mediatek\build\tools\ptgen\partition_table.xls B 修改分区头文件mediatek\custom\project\com ...

最新文章

  1. PCLint使用(一)
  2. 通过live555实现H264 RTSP直播
  3. boost::function模块右值的测试程序
  4. SAP 电商云 Spartacus UI 根据 CMS Component uid 获取数据
  5. java流与文件——读写二进制数据(DataOutput + DataInput)
  6. vue截取一个字符串_vue 截取字符串
  7. Servlet(JSP)中动态生成JPG PNG透明 水印图像
  8. 人品计算器demo,Intent传值Android
  9. NOI十连测 第三测 T1
  10. 通过工具XShell4生成密钥对(公钥和私钥)
  11. Pr:制作片尾滚动字幕(基本图形法)
  12. sofelf转jic
  13. 综合练习--The Eighth Week
  14. 基于数字证书的UKEY安全登录 与身份认证技术研究
  15. [转载]菜鸟的草缸 篇一:器材篇(附鱼缸、过滤器、灯、草泥开箱过程)
  16. 说说你平时怎么优化mysql的_面试:给我说说你平时是如何优化MySQL的?
  17. 蓝牙标签与蓝牙信标的区别
  18. 电路原理 | 电路基本定理
  19. 内蒙古师范大学计算机科学技术学院分数线,2019内蒙古师范大学录取分数线及历年专业分数线统计表【文科 理科】...
  20. Xilinx原语的使用

热门文章

  1. C语言关键字分析系列
  2. 基于C#的词法分析关键字识别与变色
  3. linux虚拟机双显卡,Kali Linux 2.0 安装 NVIDIA显卡驱动实现双显卡(联想笔记本)
  4. 大话西游2服务器修改,大话西游2:9.17维护解读:五倍次数修改全服上线,灵兽村要变样啦...
  5. python建站部署_2个Python学习网站制作教程
  6. PUN ☀️九、玩家网络实例化与昵称显示
  7. 合成游戏中的数学原理
  8. Xcode 8.0 Beta发布,详解Swift语言的重大变化
  9. 什么是数据分析,我们为什么要做数据分析?
  10. AI及相关领域国际会议级别