自己动手修改源码的用户可能会遇到一个问题,那就是缺少设计师协助制作个性化的启动画面。但请放心,这里提供了一种有效的解决方案。
了解开机动画压缩包
制作开机动画前,得准备一个.zip格式的压缩文件。通常,这个压缩包里的文件类型都是固定的,其中包含一个名为disc.txt的文件,它负责说明播放的具体方式和显示尺寸。以我制作的动画为例,disc.txt文件的第一行,364、830、15这几个数字分别代表了动画的显示高度、宽度和帧数等信息。
开机动画替换所需压缩包中包含按顺序排列的帧动画文件文件夹。这些内容是构成开机动画的基础,需要提前了解。
动画结构中的关键元素
第二排的“disc.txt”文件内容至关重要。比如“p10part0”这样的格式,开头的字母“p”指的是播放方式。中间的数字代表帧与帧之间的停顿时长,最后的“part0”则指明了存放帧动画的文件夹。了解这些信息,能帮助我们制作出合适的开机动画。
364 830 15
p 1 0 part0
要制作开机动画,首先得弄明白帧动画的布局等基本结构,这是我们的出发点。如果这方面弄不明白,很容易出错。
获取帧动画的方式
p -- this part will play unless interrupted by the end of the boot
c -- this part will play to completion, no matter what
f -- same as p but in addition the specified number of frames is being faded out while continue playing. Only the first interrupted f part is faded out, other subsequent f parts are skipped
制作开机动画时,最大的挑战在于获取帧动画。可以采取以下步骤:首先,在软件中手动绘制一个逐渐变亮的动画,接着进行录屏操作,最后将录制的MP4文件转换为PNG格式。这种方法虽然操作简单,但实际效果不错。
在设计开机动画时,我追求简洁风格,采用“OS”字样进行渐变亮起。这样的做法在获得帧动画的同时,既降低了成本,又满足了基本需求。
具体的制作过程
创建了一个新的演示项目,我挑选了免费的Black字体。在应用xml文件里,我设置了控件的字体。我使用的设备是运行AOSP车机系统的Pixel5,因为开机时屏幕方向有误,所以我将控件旋转了90度来放置。
随后,代码中加入了逻辑,工具类中设置了全屏的扩展方法。动画编写时,为了方便,直接使用了协程和延迟,虽然做法直接了当,但实际效果不错。
视频处理及后续操作
<TextView
android:id="@+id/tv_animationtext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/cooper_black"
android:rotation="90"
android:alpha="0"
android:text="Stephen OS"
android:textColor="@color/white"
android:textSize="88sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
启动录屏工具并导出MP4文件,接着截取开头和结尾,提取出纯净的开机动画视频。通过“视频转PNG”网站将MP4转换成PNG格式,免费服务已能满足需求。将转换得到的PNG文件下载至本地,进行批量重命名,并按顺序排列存放。
之后,请将帧动画存入part0文件夹。打包时,要选用恰当的方法,切记不要直接用7zip进行打包。请选择存储模式进行压缩。
fun AppCompatActivity.setFullScreenMode() {
val layoutParams = window.attributes
layoutParams.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
window.attributes = layoutParams
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
val uiOptions = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN)
window.decorView.systemUiVisibility = uiOptions
}
整合到设备中
将制作好的.zip文件存入源码的特定文件夹,然后在设备的mk文件中任意位置添加一条文件复制命令。在打包过程中,该zip文件会被自动复制到ROM的/media目录中,系统启动时将优先播放该动画。我制作的动画仅是一个大文字逐渐变亮的简单效果。
val logoText = rootView.findViewById(R.id.tv_animationtext)
MainScope().launch {
delay(2000L)
repeat(255) {
delay(7)
infoLog(it.toString())
logoText.alpha = (it / 255.0).toFloat()
}
}
制作开机动画时,你是否遇到过其他特殊难题?期待大家点赞并转发此篇文章,同时欢迎在评论区留言交流。