使用openGL,执行android()方法
- 来到frameworks/base/cmds/bootanimation/bootanimation_main.cpp下:
/**
这个方法就是将android-logo-mask.png和android-logo-shine.pn进行绘制,增加纹理,参数设定,
最后执行do-while循环进行绘制,绘制完成执行glDeleteTextures
**/
bool BootAnimation::android()
{
ALOGD("%sAnimationShownTiming start time: %" PRId64 "ms", mShuttingDown ? "Shutdown" : "Boot",
elapsedRealtime());
//上方的图片
initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
//下方的图片
initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");
mCallbacks->init({});
//新增
bool hasInitFont = false;
if (initFont(&mClockFont, CLOCK_FONT_ASSET) == NO_ERROR) {
hasInitFont = true;
ALOGD("android init Font ok ,fontname = %u",mClockFont.texture.name);
}
// clear screen
glShadeModel(GL_FLAT);
glDisable(GL_DITHER);
glDisable(GL_SCISSOR_TEST);
glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(mDisplay, mSurface);
glEnable(GL_TEXTURE_2D);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
//
const GLint xc = (mWidth - mAndroid[0].w) / 2;
const GLint yc = (mHeight - mAndroid[0].h) / 2;
// const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h);
//增加显示区域
const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h*2);
glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(),
updateRect.height()*2);
// Blend state 透明度
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
const nsecs_t startTime = systemTime();
//开始绘制
do {
nsecs_t now = systemTime();
double time = now - startTime;
float t = 4.0f * float(time / us2ns(16667)) / mAndroid[1].w;
GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w;
GLint x = xc - offset;
glDisable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_SCISSOR_TEST);
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, mAndroid[1].name);
glDrawTexiOES(x, yc, 0, mAndroid[1].w, mAndroid[1].h);
glDrawTexiOES(x + mAndroid[1].w, yc, 0, mAndroid[1].w, mAndroid[1].h);
glEnable(GL_BLEND);
//融合
glBindTexture(GL_TEXTURE_2D, mAndroid[0].name);
glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h);
//新增绘制时钟
drawClock(mClockFont, TEXT_CENTER_VALUE, yc + mAndroid[0].h);
//绘制
EGLBoolean res = eglSwapBuffers(mDisplay, mSurface);
if (res == EGL_FALSE)
break;
// 12fps: don't animate too fast to preserve CPU
const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now);
if (sleepTime > 0)
usleep(sleepTime);
//检测动画是否结束
checkExit();
} while (!exitPending());
//结束后就执行delete
glDeleteTextures(1, &mAndroid[0].name);
glDeleteTextures(1, &mAndroid[1].name);
//如果执行了就回收
if (hasInitFont)
glDeleteTextures(1, &mClockFont.texture.name);
return false;
}
实现效果