android 4.2 开机动画,android开机动画制作与播放原理简介 (适用android4-4.2,其他版本未试验)...

代码所在位置:/frameworks/base/cmds/bootanimation,其主要包含以下三个文件

BootAnimation_main.cpp

BootAnimation.h

bootAnimation.cpp

BootAnimation_main.cpp

BootAnimation.h

bootAnimation.cpp

2.3.1 Bootanimation_main.cpp

该文件是主入口文件;

int main(int argc, char** argv)

{

#if defined(HAVE_PTHREADS)

setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

#endif

char value[PROPERTY_VALUE_MAX];

property_get("debug.sf.nobootanimation", value, "0");

int noBootAnimation = atoi(value);

LOGI_IF(noBootAnimation,  "boot animation disabled");

if (!noBootAnimation) {

sp proc(ProcessState::self());

ProcessState::self()->startThreadPool();

// create the boot animation object

bool setBoot = true;

bool setRotated = false;

bool sePaly = true;

if(argc > 1){

if(!strcmp(argv[1],"shut"))

setBoot = false;

}

if(argc > 2){

if(!strcmp(argv[2],"nomp3"))

sePaly = false;

}

if(argc > 3){

if(!strcmp(argv[3],"rotate"))

setRotated = true;

}

char volume[PROPERTY_VALUE_MAX];

property_get("persist.sys.mute.state", volume, "-1");

int nVolume = -1;

nVolume = atoi(volume);

if(nVolume == 0 || nVolume == 1 ){

sePaly = false;

}

sp boot = new BootAnimation(setBoot,sePaly,setRotated);

IPCThreadState::self()->joinThreadPool();

}

return 0;

}

int main(int argc, char** argv)

{

#if defined(HAVE_PTHREADS)

setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

#endif

char value[PROPERTY_VALUE_MAX];

property_get("debug.sf.nobootanimation", value, "0");

int noBootAnimation = atoi(value);

LOGI_IF(noBootAnimation, "boot animation disabled");

if (!noBootAnimation) {

sp proc(ProcessState::self());

ProcessState::self()->startThreadPool();

// create the boot animation object

bool setBoot = true;

bool setRotated = false;

bool sePaly = true;

if(argc > 1){

if(!strcmp(argv[1],"shut"))

setBoot = false;

}

if(argc > 2){

if(!strcmp(argv[2],"nomp3"))

sePaly = false;

}

if(argc > 3){

if(!strcmp(argv[3],"rotate"))

setRotated = true;

}

char volume[PROPERTY_VALUE_MAX];

property_get("persist.sys.mute.state", volume, "-1");

int nVolume = -1;

nVolume = atoi(volume);

if(nVolume == 0 || nVolume == 1 ){

sePaly = false;

}

sp boot = new BootAnimation(setBoot,sePaly,setRotated);

IPCThreadState::self()->joinThreadPool();

}

return 0;

}   其主要的功能是根据传进来的参数决定是是要播放开机还是关机动画/铃音,并且启动BootAnimation;

2.3.2 BootAnimation.cpp

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

status_tBootAnimation::readyToRun() {

……………省略………………………

mAndroidAnimation = false;

if(bBootOrShutDown){

status_t err = mZip.open("/data/local/bootanimation.zip");

if (err != NO_ERROR) {

err =mZip.open("/system/media/bootanimation.zip");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

}else {

if(!bShutRotate){

status_terr = mZip.open("/data/local/shutanimation.zip");

if (err != NO_ERROR) {

err =mZip.open("/system/media/shutanimation.zip");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

}

}

return NO_ERROR;

}

status_tBootAnimation::readyToRun() {

……………省略………………………

mAndroidAnimation = false;

if(bBootOrShutDown){

status_t err = mZip.open("/data/local/bootanimation.zip");

if (err != NO_ERROR) {

err =mZip.open("/system/media/bootanimation.zip");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

}else {

if(!bShutRotate){

status_terr = mZip.open("/data/local/shutanimation.zip");

if (err != NO_ERROR) {

err =mZip.open("/system/media/shutanimation.zip");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

}

}

return NO_ERROR;

}readyToRun() 方法判断/system/media/bootanimation.zip(shutanimaion.zip)是否存在,如果存在,则将 mAndroidAnimation 设置false,这个变量决定threadLoop中调用android()还是movie()来具体实现动画的播放。

boolBootAnimation::threadLoop()

{

........省略........

if(!bBootOrShutDown){

pSoundFileName="/data/local/shutaudio.mp3";

pBackupSoundFileName="/system/media/shutaudio.mp3";

} else {

pSoundFileName="/data/local/bootaudio.mp3";

pBackupSoundFileName="/system/media/bootaudio.mp3";

}

if (mAndroidAnimation)

r = android();

} else {

r = movie();

}

}

boolBootAnimation::threadLoop()

{

........省略........

if(!bBootOrShutDown){

pSoundFileName="/data/local/shutaudio.mp3";

pBackupSoundFileName="/system/media/shutaudio.mp3";

} else {

pSoundFileName="/data/local/bootaudio.mp3";

pBackupSoundFileName="/system/media/bootaudio.mp3";

}

if (mAndroidAnimation)

r = android();

} else {

r = movie();

}

}

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

3、总结       对于图片资源时如何绘制的,我想这不是本文的重点,有兴趣的同学可以继续深究,这里仅仅是抛砖引玉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值