一.开机动画的替换
A.Android平台启动初始化,出现"A N D R I O D"文字字样画面的替换
这里所说的LOGO是在KERNAL启动后由init进程调用显示的LOGO.
Android中使用的LOGO是rle格式,一种压缩格式。
1. 将图象转换为RAW格式,使用GIMP或者Advanced Batch Converter软件,将图象转换为RAW格式。
2. 使用android自带的rgb2565工具,将RAW转换为RLE
用法:rgb2565 -rle < initlogo.raw > initlogo.rle
rgb2565 原码在:mydroid_1.5/build/tools/rgb2565 目录下
生成的执行程序在:mydroid_1.5/out/host/linux-x86/bin
执行过程:
(1)、先进入mydroid_1.5/out/host/linux-x86/bin(Z:\rk-Eclair\out\host\linux-x86\bin)目录下,若没有rgb2565则先进入mydroid_1.5/build/tools/rgb2565进行mm生成相应的可执行文件; (2)、将要转换的raw文件拷至目录mydroid_1.5/out/host/linux-x86/bin下,执行:./rgb2565 -rle < initlogo.raw > initlogo.rle 即可;
3. 将initlogo.rle打包到根文件系统中,将initlogo.rle 拷贝至
mydroid_1.5/out/target/product/w7/root/initlogo.rle(Z:\rk-Eclair\out\target\product\generic\ro ot)
其相应的代码为:
mydroid_1.5/system/core/init/init.c
mydroid_1.5/system/core/init/logo.c
B.Android平台上层图形系统启动,出现含闪动的ANDROID字样的动画图片的替换
有两种替换方法,
方法一(推荐使用),共有5个步骤
1把需要压缩的文件和图片目录准备好
Android 2.0 开机动画文件
。
开机动画文件:bootanimation.zip
动画是由系列图片连续刷屏实现的。。
bootanimation.zip文件是zip压缩文件,压缩方式要求是存储压缩,包含一个文件和两个目录:
1)动画属性描述文件:desc.txt
2)第一阶段动画图片目录:part0
3)第二阶段动画图片目录:part1
desc.txt文件内容:
480 427 30
p 1 0 part0
p 0 10 part1
desc.txt文件分析:
480 427 30
宽高帧数
p 1 0 part0
标志符循环次数阶段切换间隔时间对应目录名
p 0 10 part1
标志符循环次数阶段切换间隔时间对应目录名
==================
480表示的是图片显示的宽,427表示的图片显示的高。
标志符:
必须是: p
循环次数:
0 : 表示本阶段无限循环
阶段切换间隔时间:
单位是一个帧的持续时间,比如帧数是30,那么帧的持续时间就是1秒/30 = 33.3毫秒。
阶段切换间隔时间期间开机动画进程进入休眠,把CPU时间让给初始化系统使用。
也就是间隔长启动会快,但会影响动画效果。
part0和part1目录内包含的是两个动画的系列图片,图片为PNG格式。
系列图片文件的加载刷新按文件名的名称排序。
2 使用压缩软件7Zip,制作bootanimation.zip文件,点"Add to archive...",把选项"Compression level" 设置为"store"。
3 把bootanimation.zip放到out/target/product/generic/system/etc,重新生成镜像文件
4 然后烧写到SDK板中,当开机进入老动画的时候,在窜口终端输入
busybox cp /system/etc/bootanimation.zip /data/local
5 重新启动便可
方法二(不推荐使用):
1 开机图片存放目录,
frameworks/base/core/res/assets/images(Z:\rk-Eclair\frameworks\base\core\res\assets\images):
android-logo-mask.png
Android默认的前景图片,文字部分镂空,大小256×64
android-logo-shine.png
Android默认的背景图片,有动感效果,大小512×64
把要动画图片都放到该目录下,这里命名为01.png、02.png、03.png。。。
2 开机代码存放在:
frameworks/base/cmds/ bootanimation(Z:\rk-Eclair\frameworks\base\cmds\bootanimation)修改BootAnimation.cpp代码,假如共33张图片,修改大致如下
bool BootAnimation::android()
{
//new boot image for rockchip
int loop;
char filename[33][20];
int fileleng = 33;
for(loop = 0; loop < 33; loop++)
{
sprintf(filename[loop],"images/%02d.png",loop);
}
initTexture(&mAndroid[0],mAssets,filename[0]);
initTexture(&mAndroid[1],mAssets,filename[1]);
//clear screen
glDisable(GL_DITHER);
glDisable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(mDisplay, mSurface);
glEnable(GL_TEXTURE_2D);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
//图片允许在屏幕中显示的位置和最大值
const Rect updateRect(0, 0, mWidth, mHeight);
// draw and update only what we need
mFlingerSurface->setSwapRectangle(updateRect);
glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(),
updateRect.height());
// Blend state
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// 3 最后依序显示与解析图片
loop = 0;
int loop_in = 2;
int loop_count = 0;
const nsecs_t startTime = systemTime();
do{
nsecs_t now = systemTime();
if(loop_count == 2){ //控制动画效果的快慢,数字越大越慢if(loop < (fileleng - 1)){
loop ++;
}
else
{
loop = 22; //从这里开始反复循环
}
loop_count = 0;
}
loop_count ++;
if(loop_in < fileleng){
initTexture(&mAndroid[loop_in],mAssets,filename[loop_in]);
loop_in ++;
}
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, mAndroid[loop].name);
//画出该图片的大小,超出允许的最大值部分则丢失glDrawTexiOES(0,0, 0, mWidth, mHeight);
eglSwapBuffers(mDisplay, mSurface);
//EGLBoolean res = eglSwapBuffers(mDisplay, mSurface);
//if (res == EGL_FALSE)
//break;
const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now);
if (sleepTime > 0)
usleep(sleepTime);
} while (!exitPending());
for(loop=0;loop
Contacts
大图标在目录res/drawable-hdpi下
大图标:ic_launcher_contacts.png
小图标在目录res/drawable-mdpi下
小图标:ic_launcher_contacts.png