原创文章,转载请注明出处,谢谢。
一,前言
对于开机动画的实现原理,网上很多,本文不做讲述。本文仅针对开关机动画支持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 重启即可