android 开机动画和关机动画修改与制作

2024-06-09 02:08

本文主要是介绍android 开机动画和关机动画修改与制作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

android开机动画制作与播放原理简介
   谁都想拥有一个华丽漂亮的开机动画,这让人心情舒畅,android是怎么来实现的?怎么制作一个自己的开机动画?这里揭开android开机动画的神秘面纱。

 1、制作开关机动画

1.1 开机动画的位置

   system/media/bootanimation.zip,要修改开机动画就是修改bootanimation这个压缩文件。如果不存在该压缩包,使用原生自带的资源,其路径在system/framework/framework-res.apk/assets/images(Android-logo-mask.png,android-logo-shine.png),但是比较难看,比较常见的就是“android”。所以要定制自己的开关机动画一般都是在system/media/目录下放置bootanimation.zip和shutanimation.zip.这里以开机动画为例,关机动画和开机动画其原理一样。

1.2 bootanimation.zip文件结构

  bootanimation里面主要包含一个desc.txt以及N个文件夹。而文件夹里面放着的就是开机动画的图片资源。decs.txt的作用就是指导系统如何去执行开机动画。

   desc.txt编写规范,例如开机动画需要用到2个文件夹,分别是folder1和folder2,开机的时候,先把folder1里面的图片都播放一遍,然后再循环播放folder2里面的文件,直到进入系统,decs.txt文档的内容如下:

[plain] view plain copy
  1. 320 480 12  
  2. p 1 0 folder1  
  3. p 0 0 folder2  
320 480是代表屏幕的分辨率,12表示12帧每秒,简单地说12代表一秒钟播放12张图片;
p 1 0 part1:p就是play。1是播放一次,0是无限次。0代表阶段间隔帧数为0folder1就是说,这条指令是针对folder1这个文件夹的;
p 0 0 part2:第一个0这里是代表循环播放,第二个0和上面第二条指令一样。folder2就是第二个文件夹。
总结规则如下:
第一条指令:[屏幕的分辨率] [播放频率]
第二条指令:[p] [播放次数] [间隔帧数] [文件夹]
第N条指令: 同上

1.3 压缩包

   把需要用到的folder文件夹跟decs.txt打包成zip格式,必须是zip,不能是rar,且打包的时压缩方式选择“存储”模式。然后改名成为bootanimation.zip,最后将制作好的zip包push到/system/media目录下。

注意:bootanimation不能太大,一般最好不要超过3M。

1.4 查看动画

 在终端中输入命令:

     adb shell---> cd /system/bin--->bootanimation 或者bootanimation shut

 这样不用重启即可查看定制的动画,方便。

1.5 硬性条件

   手机必须有root权限,否则我们制作好的图片资源没办法push到/system/media目录,另外执行bootanimaiton也有可能没有权限,所以这里要定制自己的手机必须有root权限,当然了至于使用什么样的方式大家可以根据自己的爱好,各显神通。

 2、播放原理

   通过上面的准备开机资源已经制作好了,那android是怎么来实现播放的。首先对于开关机动画的播放,android专门使用了一个 native service来实现播放(/system/bin/bootanimation),包括开机铃声的实现也是用该service来实现的。

2.1 bootanimation的启动

    Android系统在init.rc中定义了很多Service,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含bootanimation。

   每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ ctl.start ”和“ctl.stop ”是用来启动和停止服务的。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。

[plain] view plain copy
  1. service bootanim /system/bin/bootanimation  
  2.     user graphics  
  3.     group graphics system audio qcom_oncrpc  
  4.     disabled  
  5.     oneshot  

定义了一个bootanim的服务,对应执行/system/bin/bootanimation

disabled 表示init进程创建只是创建它,但不立刻执行;

oneshot 表示该服务只执行一次;

2.2 开机动画调用

通过上面可知,bootanimation的调用同故宫clt.start 和ctl.stop来实现的,当我们开机启动时,系统内核起来后,启动android,这时就会启动开机动画具体是在

SurfaceFlinger.cpp的readyToRun方法中调用,为什么会在这调用,请回顾一下开机流程。

[plain] view plain copy
  1. status_t SurfaceFlinger::readyToRun()   
  2. {  
  3.     // start boot animation service  
  4.     property_set("ctl.start", "bootanim");//  
  5.      
  6. }  
当android启动完成后,关闭掉开机动画
[plain] view plain copy
  1. void SurfaceFlinger::bootFinished()   
  2. {  
  3.     //stop bootanim service  
  4.     property_set("ctl.stop", "bootanim");  
  5. }  

2.3 bootanimation 源码分析

代码所在位置:/frameworks/base/cmds/bootanimation,其主要包含以下三个文件
[plain] view plain copy
  1. BootAnimation_main.cpp  
  2. BootAnimation.h  
  3. bootAnimation.cpp  

2.3.1 Bootanimation_main.cpp

该文件是主入口文件;

[plain] view plain copy
  1. int main(int argc, char** argv)  
  2. {  
  3. #if defined(HAVE_PTHREADS)  
  4.     setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);  
  5. #endif  
  6.     char value[PROPERTY_VALUE_MAX];  
  7.     property_get("debug.sf.nobootanimation", value, "0");  
  8.     int noBootAnimation = atoi(value);  
  9.     LOGI_IF(noBootAnimation,  "boot animation disabled");  
  10.     if (!noBootAnimation) {  
  11.         sp<ProcessState> proc(ProcessState::self());  
  12.         ProcessState::self()->startThreadPool();  
  13.         // create the boot animation object  
  14.         bool setBoot = true;  
  15.         bool setRotated = false;  
  16.         bool sePaly = true;  
  17.         if(argc > 1){  
  18.            if(!strcmp(argv[1],"shut"))  
  19.             setBoot = false;  
  20.         }  
  21.         if(argc > 2){  
  22.             if(!strcmp(argv[2],"nomp3"))  
  23.             sePaly = false;  
  24.         }  
  25.           
  26.         if(argc > 3){  
  27.             if(!strcmp(argv[3],"rotate"))  
  28.             setRotated = true;  
  29.         }  
  30.         char volume[PROPERTY_VALUE_MAX];  
  31.         property_get("persist.sys.mute.state", volume, "-1");  
  32.         int nVolume = -1;  
  33.         nVolume = atoi(volume);  
  34.         if(nVolume == 0 || nVolume == 1 ){  
  35.             sePaly = false;  
  36.         }  
  37.         sp<BootAnimation> boot = new BootAnimation(setBoot,sePaly,setRotated);  
  38.   
  39.         IPCThreadState::self()->joinThreadPool();  
  40.   
  41.     }  
  42.     return 0;  
  43. }  
   其主要的功能是根据传进来的参数决定是是要播放开机还是关机动画/铃音,并且启动BootAnimation;

2.3.2 BootAnimation.cpp

   BootAnimation.cpp集成自Thread,在创建时会调用readyToRun()->threadLoop()。

[plain] view plain copy
  1. status_tBootAnimation::readyToRun() {  
  2. ……………省略………………………  
  3. mAndroidAnimation = false;  
  4.       if(bBootOrShutDown){  
  5.    status_t err = mZip.open("/data/local/bootanimation.zip");  
  6.    if (err != NO_ERROR) {  
  7.        err =mZip.open("/system/media/bootanimation.zip");  
  8.        if (err != NO_ERROR) {  
  9.            mAndroidAnimation = true;  
  10.        }  
  11.     }  
  12.       }else {  
  13.           if(!bShutRotate){  
  14.             status_terr = mZip.open("/data/local/shutanimation.zip");  
  15.          if (err != NO_ERROR) {  
  16.             err =mZip.open("/system/media/shutanimation.zip");  
  17.             if (err != NO_ERROR) {  
  18.                 mAndroidAnimation = true;  
  19.             }  
  20.             }  
  21.           }  
  22.       }  
  23. return NO_ERROR;  
  24. }  
readyToRun() 方法判断/system/media/bootanimation.zip(shutanimaion.zip)是否存在,如果存在,则将 mAndroidAnimation 设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。

[plain] view plain copy
  1. boolBootAnimation::threadLoop()  
  2. {  
  3.          ........省略........  
  4.       if(!bBootOrShutDown){  
  5.             pSoundFileName="/data/local/shutaudio.mp3";  
  6.             pBackupSoundFileName="/system/media/shutaudio.mp3";  
  7.       } else {  
  8.             pSoundFileName="/data/local/bootaudio.mp3";  
  9.             pBackupSoundFileName="/system/media/bootaudio.mp3";  
  10.       }  
  11.            if (mAndroidAnimation)  
  12.           r = android();  
  13.             } else {  
  14.           r = movie();  
  15.            }  
  16. }  

    threadLoop()方法根据 mAndroidAnimation 变量调用android()/movie(). 如果system/media/shutanimation.zip/bootanimation.zip存在的话,调用movie(),该接口会解析zip文件中的desc.txt文件,根据txt文件中的配置来播放动画。否则就调用android来播放原生自带的资源。

3、总结

      对于图片资源时如何绘制的,我想这不是本文的重点,有兴趣的同学可以继续深究

这篇关于android 开机动画和关机动画修改与制作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043960

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

Mysql8.0修改配置文件my.ini的坑及解决

《Mysql8.0修改配置文件my.ini的坑及解决》使用记事本直接编辑my.ini文件保存后,可能会导致MySQL无法启动,因为MySQL会以ANSI编码读取该文件,解决方法是使用Notepad++... 目录Myhttp://www.chinasem.cnsql8.0修改配置文件my.ini的坑出现的问题