Android 开关机动画的实现及支持MP4视频播放

原创文章,转载请注明出处,谢谢。


一,前言

对于开机动画的实现原理,网上很多,本文不做讲述。本文仅针对开关机动画支持Mp4视频及实现关机动画做简略讲述

二,前期准备及说明

开机动画MP4视频文件名及路径:/system/media/boot.mp4、/data/local/boot.mp4

关机动画MP4视频文件名及路径:/system/media/shutdown.mp4、/data/local/shutdown.mp4

三,需要修改的文件

1.开机动画的MP4视频支持

frameworks/base/cmds/bootanimation/BootAnimation.cpp

frameworks/base/cmds/bootanimation/BootAnimation.h

frameworks/base/cmds/bootanimation/Android.mk

2.关机动画实现

frameworks/base/cmds/bootanimation/BootAnimation.cpp

frameworks/base/cmds/bootanimation/bootanimation_main.cpp

ShutdownThread.java

init.rc

四,具体修改

   播放MP4格式支持较为简单,主要是在

frameworks/base/cmds/bootanimation/BootAnimation.cpp添加video()方法并在readytorun判断文件是否存在,并在threadloop判断是否进入video()方法。

video方法代码如下

bool BootAnimation::video()
{
    const float MAX_FPS = 60.0f;
    const bool LOOP = true;
    const float CHECK_DELAY = ns2us(s2ns(1) / MAX_FPS);

    eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
    eglDestroySurface(mDisplay, mSurface);
#if 0
    float asp = 1.0f * mWidth / mHeight;
    SurfaceComposerClient::openGlobalTransaction();
    mFlingerSurfaceControl->setPosition(mWidth, 0);
    mFlingerSurfaceControl->setMatrix(0, 1 / asp, -asp, 0);
    SurfaceComposerClient::closeGlobalTransaction();
#endif
    sp<MediaPlayer> mp = new MediaPlayer();
    mp->reset();
    if(!mShutdown) {
        if(systemfile) {
            mp->setDataSource(USER_BOOTVIDEO_FILE, NULL);
        } else {
            mp->setDataSource(SYSTEM_BOOTVIDEO_FILE, NULL);
        }
    } else {
        if(systemfile) {
            mp->setDataSource(USER_SHUTDOWN_VIDEO, NULL);
        } else {
            mp->setDataSource(SYSTEM_SHUTDOWN_VIDEO, NULL);
        }
    }
    mp->setLooping(false);
	Parcel*  _parcel = new Parcel;
	mp->setParameter(100, *_parcel);
    mp->setVideoSurfaceTexture(mFlingerSurface->getIGraphicBufferProducer());
    mp->prepare();
    mp->start();
#if 1
    while(true) {
        if(exitPending())
            break;
        usleep(CHECK_DELAY);
        checkExit();
    }
#endif
    mp->stop();
    return false;
}

关机动画实现 需要修改init.rc 添加如下服务

service shutdownanim /system/bin/bootanimation -shutdown

    user graphics

    group graphics



ShutdownThread.java修改beginShutdownSequence方法把如下代码注释掉

ProgressDialog pd = new ProgressDialog(context);
        pd.setTitle(context.getText(com.android.internal.R.string.power_off));
        pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);

        pd.show();

并添加android.os.SystemProperties.set("ctl.start", "shutdownanim");即可


最后重新编译boot及boota 重启即可

发布了13 篇原创文章 · 获赞 13 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq410942197/article/details/41042985