必威体育Betway必威体育官网
当前位置:首页 > IT技术

【android】开机动画animation定制

时间:2019-06-01 15:42:04来源:IT技术作者:seo实验室小编阅读:74次「手机版」
 

安卓开机动画

每个手机开机的时候都会有一个开机动画和铃声

不同的开机动画都有不同的效果,不管是OEM还是运营商都会对这个logo有严格的要求,当然,自己如果想DIY制作自己的动画也可以参考下面的方法

通常,animation的文件存放在\\system\media\bootanimation.zip中,文件路径并不绝对,比如QCOM和MTK就不同,可以在代码中搜索关键字来查下路径

修改开机动画就是修改bootanimation这个文件,文件中存了很多张图片,每张图片轮流播放键形成了开机动画

Ps:提到这里,大家就知道了,开机动画并不是视频,而是不停的播放图片

如果没有定制这块的内容,那么会沿用平台源生的代码,利用二进制静态制作一个开机界面,具体在LCD driver中可以找到.

*************************************************************************************

bootanimation.zip解压后会有多个文件夹和一个.txt文档,如下

文件夹里面放着的就是你要的开机动画的图片,decs.txt的作用就是指导系统如何去执行你的开机动画,里面配置有播放参数

如果我的开机动画要用到2个文件夹,分别是part1和part0.

开机的时候,先把part1里面的图片都播放一遍,然后再循环播放part0里面的文件,直到进入系统。那么decs.txt文档的内容应该如下:

320 480 15

p 1 0 part1

p 0  0 part0

第一行,320 480是代表你屏幕的分辨率,后面的15是说,15帧每秒.

第二行,p 1 0 part1。p应该是play吧,也就是播放的意思。1是播放一次。0是空指令,就是什么都不做。part1就是说,这条指令是针对part1这个文件夹的。整条指令的意思就是,

播放part1里面的图片1次,  然后什么都不做,马上进入下一条指令。

第三行,p 0 0 part0。p依然是播放。第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。

再详细看part1~X中详细的结构,名称是顺序的许多图片, 如果想要定制的朋友,可以在其中,按照顺序添加自己的图片,然后设定参数播放。

通常animation都是P参数开头的,偶尔也会有C开头的参数,如下:

×××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。

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

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

for (int i=0 ; i<pcount && !exitPending() ; i++) {

const Animation::Part& part(animation.parts[i]);

const size_t fcount = part.frames.size();

glBindTexture(GL_TEXTURE_2D, 0);

for (int r=0 ; !part.count || r<part.count ; r++) {

   for (int j=0 ; j<fcount && !exitPending(); j++) {

        const Animation::Frame& frame(part.frames[j]);

        .......

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

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的代码:

// Parse the description file

for (;;) {

......

if (sscanf(l, "%d %d %d %d", &width, &height, &fps, &flg) >= 3) {

animation.width = width;

animation.height = height;

animation.fps = fps;

}

else if (sscanf(l, " %c %d %d %s #%6s", &pathType, &count, &pause, path, color) >= 4) {

Animation::Part part;

part.playUntilComplete = pathType == 'c';

part.count = count;

part.pause = pause;

part.path = path;

part.audioFile = NULL;

if (!parseColor(color, part.backgroundColor)) {

    ALOGE("> invalid color '#%s'", color);

    part.backgroundColor[0] = 0.0f;

    part.backgroundColor[1] = 0.0f;

    part.backgroundColor[2] = 0.0f;

}

animation.parts.add(part);

}

s = ++endl;

}

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

for (size_t i=0 ; i<pcount ; i++) {

const Animation::Part& part(animation.parts[i]);

const size_t fcount = part.frames.size();

glBindTexture(GL_TEXTURE_2D, 0);

for (int r=0 ; !part.count || r<part.count ; r++) {

    // Exit any non playuntil complete parts immediately

    if(exitPending() && !part.playUntilComplete)

          break;

......

    for (size_t j=0 ; j<fcount && (!exitPending() || part.playUntilComplete) ; j++) {

    ......

    checkExit();

}

usleep(part.pause * ns2us(frameDuration));

// For infinite parts, we've now played them at least once, so perhaps exit

if(exitPending() && !part.count)

    break;

}

......

}

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

这里有个问题:重复循环显示的'c'标识片段,会不受任何约束的一直显示下去,这显然是不合适的。

于是在第二个for循环体最后,有如下代码:

// For infinite parts, we've now played them at least once, so perhaps exit

if(exitPending() && !part.count)

break;

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

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

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

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

然后就是压缩包了,把需要用到的part文件夹跟decs.txt打包成zip格式,必须是zip,不能是rar,而且打包的时候压缩方式要选择“存储”模式。然后改名成为bootanimation.zip,然后替换原文件即可生效

相关阅读

android开机动画bootanimation

android开机动画bootanimationbootanim服务源码:frameworks/base/cmds/bootanimation/bootanim.rcservice bootanim /system/bin/b

安卓手机开机动画bootanimation.zip文件制作以及注意

刚刚将原生Android系统开机logo和开机动画做了调整,为此耗费了接近半天的时间,碰到了很多问题,幸好最终达成了目的。一,首先说一下boo

分享到:

栏目导航

推荐阅读

热门阅读