Android修改开关机动画声音教程文件.docx
- 文档编号:14829608
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:27
- 大小:1.39MB
Android修改开关机动画声音教程文件.docx
《Android修改开关机动画声音教程文件.docx》由会员分享,可在线阅读,更多相关《Android修改开关机动画声音教程文件.docx(27页珍藏版)》请在冰点文库上搜索。
Android修改开关机动画声音教程文件
Android修改开关机动画声音
开机画面,按照国际惯例,一般是分为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文档的内容应该如下:
3024805
p10part1
p00part2
就这么多,现在解释一下这些命令吧。
第一行,320480是代表你屏幕的分辨率,因为我们的胖6是320*480的,这就不多说了。
后面的5是说,5帧每秒,不懂的可以这么理解,5是代表一秒钟播放5张图片。
就这么简单。
第二行,p10part1。
p应该是play吧,也就是播放的意思。
1是播放一次。
0是空指令,就是什么都不做。
part1就是说,这条指令是针对part1这个文件夹的。
整条指令的意思就是,播放part1里面的图片1次,然后什么都不做,马上进入下一条指令。
第三行,p00part2。
p依然是播放。
第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。
part2也就不多说了。
至于为什么第一个0为什么是代表循环,只能这么说,这事国际惯例,就像用迅雷的时候,0代表不限制速度一样,系统规定的,你知道就好,别纠结。
总结公式如下
第一条指令:
屏幕的分辨率(空格)播放频率
第二条指令:
p(空格)播放次数(空格)后续操作(空格)作用文件夹
第三条指令:
同上
第N条指令:
同上
屏幕分辨率的格式是:
宽(空格)高,胖6的就是320480。
。
。
播放频率,上面已经说清楚了,至于到底要用多大的数字,视你开机动画的张数而定,比如说,一共有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)(Android1.5及以上版本已经取消加载图片);
2.Android平台启动初始化,出现"ANDRIOD"文字字样画面;
3.Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。
现在我们说的是第三种方式(基于模拟器):
android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/bootanimation.zip或/system/media/bootanimation.zip里面的png图片以动画的形式播放出来。
首先,我们先来分析一下源码:
frameworks/base/cmds/bootanimation/BootAnimation.cpp
首先看一下定义的常量:
1
2
3
4
#defineUSER_BOOTANIMATION_FILE"/data/local/bootanimation.zip"
#defineSYSTEM_BOOTANIMATION_FILE"/system/media/bootanimation.zip"
#defineSYSTEM_ENCRYPTED_BOOTANIMATION_FILE"/system/media/bootanimation-encrypted.zip"
BootAnimation:
:
readyToRun()
进入一个if判断语句
1
2
3
4
5
6
7
8
9
10
11
if ((encryptedAnimation&&
(access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE,R_OK)== 0)&&
(mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)== NO_ERROR))||
((access(USER_BOOTANIMATION_FILE,R_OK)== 0)&&
(mZip.open(USER_BOOTANIMATION_FILE)== NO_ERROR))||
((access(SYSTEM_BOOTANIMATION_FILE,R_OK)== 0)&&
(mZip.open(SYSTEM_BOOTANIMATION_FILE)== NO_ERROR))){
mAndroidAnimation= false;
}
BootAnimation:
:
threadLoop()
1
2
3
4
5
if (mAndroidAnimation){
r= Android();// 执行android字体闪动的图片
}else {
r= movie();// 执行bootanimation.zip中提供的动画图片
}
1
==>BootAnimation:
:
Android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png"
==>BootAnimation:
:
movie()会加载bootanimation.zip中的内容
我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面
所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行makesnod整合进img包就可以看到效果了
如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画
那两张图片放在./frameworks/base/core/res/assets/images 目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。
我是用Photoshop直接修改的
修改完后直接替换,然后再mmmframeworks/base ,makesnod即可
以下是我修改后的效果图:
看样子还想那么回事
接下来我们给系统添加开机声音
由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎
首先在BootAnimation.h添加方法的声明和头文件的引用
1
2
#include
#include
添加方法voidbootMusic();
然后在BootAnimation.cpp中实现这个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
voidBootAnimation:
:
bootMusic()
{
int index;
MediaPlayer* mp= newMediaPlayer();
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系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adbshell了,没用的
其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把poweron.wav放到这里就行了,当然如果你这时再emulaor也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,makesnod一下
然后和图上一样,你就会生成新的system.img,当然你之前添加的poweron.wav也会自动被编译进去了
然后再修改bootanimation_main.cpp这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调
1
2
3
//playbootmusic-yp
BootAnimation*animation= newBootAnimation();
animation->bootMusic();
修改完这写以后还需要修改Android.mk文件
因为播放声音还需要引入库
LOCAL_SHARED_LIBRARIES:
=\
libcutils\
libutils\
libbinder\
libui\
libskia\
libEGL\
libGLESv1_CM\
libgui\
libmedia
请注意,libmedia是新添加的;
完事后就ok了,当然还是需要编译的
mmm frameworks/base/cmds/bootanimation/
makesnod
大功告成,这样你就成功的添加了开机音乐
也许有人会问,那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还有makesnod命令了
其实还有一种办法,如果你不想这么麻烦,你可以之际把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;
SkBitmapbitmap;
SkImageDecoder:
:
DecodeMemory(asset->getBuffer(false),asset->getLength(),
&bitmap,SkBitmap:
:
kNo_Config,SkImageDecoder:
:
kDecodePixels_Mode);
asset->close();
deleteasset;
所以按照这个方法就可以找到poweron.wav这个文件了,然后修改下bootMusic的代码就可以了。
——————————————————————————————————————————————————————————————————————————————————
原创文章,转载请注明出处,谢谢。
系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/media/下添加相应的音频文件。
长按Power键弹出关键选项,关机时也只是显示进度条,而不是我们期望的关机动画同时伴有关机铃声,当然在做二次开发的时候,这些都是可以定制的。
下面将逐步分析如何实现这些定制化的需求。
一. 制作开机动画
开机画面是保存在/system/media的bootanimation.zip,下面分析系统开机画面的构成
文件名为bootanimation.zip 一定是这个不能修改,里面包含part1part2文件夹和desc.txt,part 文件夹里面放的是动画拆分的图片,格式为png, desc.txt里面是播放的设置。
格式是这样的
48080015
p10part0
p00part1
480800是指显示的分辨率宽高
15是一秒的帧数
p后面的数字是指播放次数 0为循环,N为播放N次
后面那位数字一般为0(空指令), 表示播放一遍后稍作停顿的时间
part0,part1 为文件夹名
一般我们只使用part0目录
图片准备好了,desc.txt里面的命令也准备好了,就可以把他们一起打包压缩成zip格式了。
记住,是zip格式,而不是rar格式。
另外压缩的时候注意一点,压缩的时候压缩方式要选择存储,否则开机时手机会不认的。
当然不至于变砖,只是开机的时候会黑着没动画一直到进入桌面为止。
开机动画的替换也很简单,我们把做好的bootanimation.zip替换掉原来的/system/media/bootanimation.zip文件即可。
关机动画其实和开机动画的制作一样,我们命名为shutdownanimation.zip,和bootanimation.zip放在同一目录下。
二. 开关机动画实现原理
Android系统在init.rc中定义了很多Servic,具体定义格式可以参考《AndroidPlatformDeveloper’sGuide》中的“AndroidInitLanguage”。
Init.rc中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画,但没有关机动画的定义
servicebootsound/system/bin/mplayer/system/media/bootsound
usermedia
groupaudio
oneshot
//开机铃声服务 /system/media/startupsound是铃声文件
servicestartupsound/system/bin/mplayer/system/media/startupsound
usermedia
groupaudio
disabled
oneshot
//关机铃声服务 /system/media/shutdownsound是关机铃声
serviceshutdownsound/system/bin/mplayer/system/media/shutdownsound
usermedia
groupaudio
disabled
oneshot
//定义了一个bootanim的服务,对应执行/system/bin/bootanimation
//disabled 表示init进程创建只是创建它,但不立刻执行
//oneshot 表示该服务只执行一次
servicebootanim/system/bin/bootanimation
usergraphics
groupgraphics
disabled
oneshot
当android系统boot时,开始加载动画和开机铃声,其代码位于
//源文件SurfaceFlinger.cpp
status_tSurfaceFlinger:
:
readyToRun(){
//startbootanimationservice
property_set("ctl.start","bootanim");//注
{
charvalue[PROPERTY_VALUE_MAX];
property_get("persist.sys.profile.silent",value,"0");
if(atoi(value)==0){
LOGI("start:
persist.sys.profile.silentissoundable");
//startstartupsoundservice
property_set("ctl.start","startupsound");//注
}else{
LOGI("start:
persist.sys.profile.silentissilent");
}
}
returnNO_ERROR;
}
当Android完成boot后,关闭动画和开机铃声,代码位于
//源文件SurfaceFlinger.cpp
voidSurfaceFlinger:
:
bootFinished(){
constnsecs_tnow=systemTime();
constnsecs_tduration=now-mBootTime;
LOGI("Bootisfinished(%ldms)",long(ns2ms(duration)));
mBootFinished=true;
//stopbootanimservice
property_set("ctl.stop","bootanim");
charvalue[PROPERTY_VALUE_MAX];
property_get("persist.sys.profile.silent",value,"0");
if(atoi(value)==0){
LOGI("stop:
persist.sys.profile.silentissoundable");
//stopstartupsoundservice
property_set("ctl.stop","startupsound");
}else{
LOGI("stop:
persist.sys.profile.silentissilent");
}
}
如何理解ctr.start和ctr.stop系统属性?
每一项服务必须在/init.rc中定义.Android系统启动时,init守护进程将解析init.rc和启动属性服务,属性“ctl.start”和“ctl.stop”是用来启动和停止服务的。
一旦收到设置“ctrl.start”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。
这项服务的启动结果将会放入“init.svc.<服务名>“属性中 。
客户端应用程序可以轮询那个属性值,以确定结果。
想更深入了解Androidproperty系统可以参考博文《(翻译)Android属性系统》。
property_set("ctl.start",ServiceName);就是启动ServiceName服务(在init.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 修改 开关机 动画 声音 教程 文件