framework开发:开机动画流程—使用opengl绘制开机动画

使用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;
}



实现效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值