A n d r o i d修改开关机动画声音开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用“开机动画”这词。
首先,开机动画的地址:system\media\bootanimation.zip。
要修改开机动画就是修改bootanimation这个文件。
如果说你的手机里没有这个文件,那就是说明你用的是官方原始版本的rom,开机动画没有被修改过,但这不碍事,没有就放一个进去,到时候想换回最原始的开机画面,也可以把bootanimation这个文件删了。
官方最原始的开机动画在system\ framework\framework-res.apk\assets\images里面,里面主要是2张图片,高手面可以去研究一下,说不定通过这个文件可以用代码实现动画的过程。
接下来,说说bootanimation.zip这个文件的结构。
bootanimation里面主要包含一个desc.txt以及N 个文件夹。
而文件夹里面放着的就是你要的开机动画的图片。
decs.txt的作用就是指导系统如何去执行你的开机画面。
下面继续说说desc.txt这个文档要怎么写。
先看例子,如果我的开机动画要用到2个文件夹,分别是part1和part2,。
我希望开机的时候,先把part1里面的图片都播放一遍,然后再循环播放part2里面的文件,直到进入系统。
那么decs.txt文档的内容应该如下:302 480 5p 1 0 part1p 0 0 part2就这么多,现在解释一下这些命令吧。
第一行,320 480是代表你屏幕的分辨率,因为我们的胖6是320*480的,这就不多说了。
后面的5是说,5帧每秒,不懂的可以这么理解,5是代表一秒钟播放5张图片。
就这么简单。
第二行,p 1 0 part1。
p应该是play吧,也就是播放的意思。
1是播放一次。
0是空指令,就是什么都不做。
part1就是说,这条指令是针对part1这个文件夹的。
整条指令的意思就是,播放part1里面的图片1次,然后什么都不做,马上进入下一条指令。
第三行,p 0 0 part2。
p依然是播放。
第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。
part2也就不多说了。
至于为什么第一个0为什么是代表循环,只能这么说,这事国际惯例,就像用迅雷的时候,0代表不限制速度一样,系统规定的,你知道就好,别纠结。
总结公式如下第一条指令:屏幕的分辨率(空格)播放频率第二条指令:p(空格)播放次数(空格)后续操作(空格)作用文件夹第三条指令:同上第N条指令:同上屏幕分辨率的格式是:宽(空格)高,胖6的就是320 480。
播放频率,上面已经说清楚了,至于到底要用多大的数字,视你开机动画的张数而定,比如说,一共有100张图片,开机时间是20秒,那么100/20就是5。
播放次数,1是代表一次,0代表循环播放。
如果要播放2次的话,就是就是打个2上去,应该是这样吧,反正我是没试过,只试过0和1.后续操作,0代表什么都不做,直接进入下一条指令。
10是代表稍作停顿。
至于文件夹里面的图片,比较简单,首先,纠正一个说法,之前说必须要是png 格式,经过我试验证明,jpg 格式的也可以,其他的有待试验,不过只支持静态图片这点应该是真的,动态图片同样有待试验。
其次,关于图片的尺寸,是不做要求的,只要在txt 文档里写好手机的分辨率即可,开机的时候系统会自动适配。
其其次要按播放循序命名,建议用5位数字,比如说,第一张图片是00010,第二张就是00020.。
为什么要从00010开始,而不是00001?因为这事预防以后要在第一张和第二张中间再插一张图片进去的话,就可以把插进去的图片命名为00011,在00010之后,00020之前。
就这么简单。
至于图片那里来嘛,当然是自己网上找啦,也可以下载别人的bootanimation ,然后修改一下。
最后就是压缩包了,把需要用到的part 文件夹跟decs.txt 打包成zip 格式,必须是zip ,不能是rar ,而且打包的时候压缩方式要选择“存储”模式。
然后改名成为bootanimation.zip ,复制到SD 卡里,再通过RE 文件管理器复制到system\media\下面,重启。
要注意一下,bootanimation 不能太大,大了会卡,一般不要超过3M ,。
————————————————————————————————————————————————————————————————————————————————————1. Linux 系统启动,出现Linux 小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);2. Android 平台启动初始化,出现"A N D R I O D"文字字样画面;3. Android 平台图形系统启动,出现含闪动的ANDROID 字样的动画图片(start)。
现在我们说的是第三种方式(基于模拟器):android 开机动画叫源码位于frameworks/base/cmds/bootanimation 下,这个程序会将/data/local/bootanimation.zip 或/system/media/bootanimation.zip 里面的png 图片以动画的形式播放出来。
首先,我们先来分析一下源码:frameworks/base/cmds/bootanimation/BootAnimation.cpp首先看一下定义的常量:BootAnimation::readyToRun()进入一个if 判断语句BootAnimation::threadLoop()看样子还想那么回事接下来我们给系统添加开机声音由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎首先在BootAnimation.h添加方法的声明和头文件的引用1 2 #include <media/AudioSystem.h> #include <media/mediaplayer.h>添加方法 void bootMusic();然后在BootAnimation.cpp 中实现这个方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void BootAnimation::bootMusic(){int index;MediaPlayer* mp = new MediaPlayer();if (mp->setDataSource("/system/etc/poweron.wav", NULL)== NO_ERROR) {mp->setAudioStreamType(AUDIO_STREAM_ENFORCED_AUDIBLE); mp->prepare();}AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFORCED_AUDIBLE, &index);if (index != 0) {mp->seekTo(0);mp->start();}}请注意这个目录setDataSource("/system/etc/poweron.wav", NULL)其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下比如,这个目录是system/etc (这个目录是android 系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell 了,没用的其实system/etc 这个目录对应的是我们编译后out 文件夹下的xxx ,然后在system/etc ,所以你把poweron.wav 放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod 一下然后和图上一样,你就会生成新的system.img,当然你之前添加的poweron.wav也会自动被编译进去了然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调123//play boot music -ypBootAnimation *animation = new BootAnimation();animation->bootMusic();修改完这写以后还需要修改Android.mk文件因为播放声音还需要引入库LOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libui \libskia \libEGL \libGLESv1_CM \libgui \libmedia请注意,libmedia是新添加的;完事后就ok了,当然还是需要编译的mmm frameworks/base/cmds/bootanimation/make snod大功告成,这样你就成功的添加了开机音乐也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?源码目录在framworks/base/data/sounds至于编译完成后放到什么地方了那是Android.mk文件上配置的不过这里叫AllAudio.mk我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看这下你们顿时明白了吧,这些资源编译后都去了神马地方所以,在刚才添加poweron.wav的时候,其实可以直接把声音资源丢到framworks/base/data/sounds这个目录下然后再mk文件中这样修改:$(LOCAL_PATH)/poweron.wav:system/etc/poweron.wav \不用我说,当然是执行mmm还有make snod命令了其实还有一种办法,如果你不想这么麻烦,你可以之际把poweron.wav 文件丢到./frameworks/base/core/res/assets/sounds下,用的时候怎么用呢?加载的时候路径是什么呢?我们看看源码我们可以看到之前我们修改的那两张图片是怎么被加载进来的而这个方法的两个参数是:是不是顿时又明白了?原来精髓所在是有个Asset 可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。
1 2 3 4 5 6 7 8 Asset* asset = assets.open(name, Asset::ACCESS_BUFFER);if (!asset)return NO_INIT;SkBitmap bitmap;SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(),&bitmap, SkBitmap::kNo_Config,SkImageDecoder::kDecodePixels_Mode);asset->close();delete asset;所以按照这个方法就可以找到poweron.wav 这个文件了,然后修改下bootMusic 的代码就可以了。