近期学习发展
最近RedfinDemo运用开发基本阻滞,一是工作繁忙,二是由于想要结合framework联动完结需求,不会C++是不行滴。所以在主攻C++的学习,又有大佬推荐《21天学通C++》,看了下果然简练高效,编排合理。
在学习C++过程中还发现Kotlin的一些特性和C++很类似啊,比方主动类型推断,函数的语法糖,默许函数参数等等。Kotlin算是站在巨人的肩膀上,其也是一门优秀的言语,在Android领域被谷歌选为First的言语页家常便饭了。
玩点好玩的
学习C++之余,想把原生AOSP的开机动画给更新替换下,换换口味。
我们都知道,AOSP的默许开机动画是一个“ANDROID”的字样,合作一个突变的底色动画。定制一个自己的开机动画,对于手机厂商来说,有利于宣扬品牌,显现企业文化。
像国内广为人知的定制体系,比方MIUI,ColorOS,FlymeOS等,都是没有直接运用默许动画的,定制了一套他们自己厂商的开机动画。而考虑到大厂都是人力充足,设计师,动效师,应有尽有。
(以下两张图片来自网络,如有侵权联系删除)
那像我这自己在下面玩玩源码的,没有设计师帮忙,该怎么搞一套看得过去的定制化的开机动画呢?
开端制造
从压缩包制造倒推流程
首要了解到,我们假如想要做开机动画的替换,需求预备一个bootanimation.zip的压缩包。
压缩包里边的文件格局一般比较固定:一个disc.txt,用来描述帧动画的播映策略和显现巨细。若干个文件夹,里边是依照顺序命名的帧动画文件。像我的便是下面这个结构:
disc.txt里的文件内容格局也比较简略:
364 830 15
p 1 0 part0
第一排364 830 15 ,顺次表明:动画显现区域height高度364,width宽度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
像p就表明直接全程播映,直到开机完结。第二位的1表明播映一次,假如是0便是循环播映。
第三位的0表明两帧图片之间间隔0ms,最终的part0表明这些帧动画在这个文件夹中。
文件写法清晰了。难点在于怎么搞到这些帧动画呢?
帧动画的制造
直接先展现制造道路:
Android运用里手动写一个简略的渐亮动画——>录屏——>MP4转PNG
我预备在Android运用里手写一个动画,在想办法转成png。
设计上力求简练,用“Stephen OS”作为案牍,也是做一个渐亮的表现形式。
计划定下来了,接下来随意新建一个demo项目。我找到一个免费字体Cooper Black,到运用xml里添加TextView控件,设置字体fontFamily:
<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" />
由于我是Pixel 5 上刷的AOSP车机体系,所以开机时的屏幕方向还是vertical方向的,而我需求让其横向展现,所以在这个控件放置时直接旋转了90度。而且初始的透明度为0.
然后在Activity里预备写逻辑,随手在东西类里写一个顶层扩展办法,给Activity设置强制全屏:
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
}
动画编码为求简练迅速,没有用传统的ValueAnimator,而是直接协程里运用repeat加delay,这种写法适当简略粗暴。
val logoText = rootView.findViewById<TextView>(R.id.tv_animationtext)
MainScope().launch {
delay(2000L)
repeat(255) {
delay(7)
infoLog(it.toString())
logoText.alpha = (it / 255.0).toFloat()
}
}
然后开启录屏软件,减去收尾,得到一个纯洁的MP4,里边便是估计显现的开机动画了。
最终用到这样一个网站,能够将MP4转为png:Video to PNG image sequence converter
相同也是简略粗暴,免费版的功能已经够用了。
得到png后我们下载到本地,批量重命名成顺序的格局。将其放置到part0的文件夹中。预备和disc.txt一同打包。这里有一个坑,不能够直接用7zip打包成zip,最好运用winrar,压缩方式要挑选存储:
集成到源码
压缩完结后,我们将bootanimation.zip放置到源码的某一个文件夹中。然后在你设备product的mk文件中,随意一个位置,加一句文件复制的指令:
PRODUCT_COPY_FILES +=
<path-to-your-bootanimation.zip>:system/media/bootanimation.zip
在打包时,将这个zip包复制到ROM的system/media文件夹下,开机后android体系会查找这个文件夹下有没有文件,有的话就优先播这个动画。
最终的制品
制品就像下面这样,一个大文字,从无到有渐亮的简略动画。感兴趣的独立开发者,也能够考虑考虑这种克己的计划。