基于Android P,自定义Android开机动画的方法

简介: 本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。

1.前言

  • 基于android P(9.0)环境

.
安卓的开机动画是一个ZIP压缩文件,里面包含了脚本文件,以及一系列的PNG图片,脚本文件用于解释如何播放这些PNG图片。

本文,以谷歌原文为基础,详细解释自定义安卓开机动画的方法,基于Android P

2. 基本步骤

  1. 解压一个正常播放的bootanimation.zip文件,采用其结构和目录
  2. 删除其PNG文件和多余的part目录
  3. 将PNG文件按需要分组,存放到各part目录中
  4. 编辑控制播放的脚本文件desc.txt
  5. 重新压缩为bootanimation.zip文件
  6. 部署到开发部或者虚拟机上测试
  7. 修改aosp源码,集成到安卓系统源代码目录中
  8. 编译成系统镜像,确认修改正确

3.bootanimation.zip 自定义方法

3.1 存放路径

Android的开机动画是以bootanimation.zip的形式存储在手机、TV等安卓设备上,安卓启动时候,搜索开机动画的ZIP文件的优先顺序如下,只会播放其中一个:

如果设置prop属性vold.decrypt = 1,则:
(1)/system/media/bootanimation-encrypted.zip (if getprop("vold.decrypt") = '1')
否则:
(2)/system/media/bootanimation.zip
(3)/oem/media/bootanimation.zip

从以上路径可知,在源码集成的时候,只需让Makefile在编译过程中,将bootanimation.zip复制到android设备的其中一个目录即可。

3.2 文件结构

下面的ZIP动画文件,是从Android R中获取的原生文件,即谷歌的androidTV开机动画。

在自定义自己动画的时候,我们只需要将自己的图片,按场景或者自己的意图,分目录存储好,再编辑下动画的脚本文件即可。

szhou@bcsrv01:~/Documents/R$ tree -L 3
.
├── bootanimation
│   ├── desc.txt            ---> 控制动画播放的-格式化的-脚本文件 
│   ├── part0               ---> part 0 -- part N 用于组织各个场景的图片,同场景的放同目录
│   │   └── 00000.png
│   ├── part1
│   │   ├── 01000.png
│   │   ├── 省略.png
│   │   └── 01033.png
│   ├── part2
│   │   ├── 02000.png
│   │   ├── 省略.png
│   │   └── 03184.png
│   ├── part4
│   │   ├── 04000.png
│   │   ├── 省略.png
│   │   └── 04101.png
│   └── part5
│       ├── 00000.png
│       ├── 省略.png
│       └── 00010.png
└── bootanimation.zip       ---> ZIP动画原文件,来自于Android R(11.0)

7 directories, 374 files
szhou@bcsrv01:~/Documents/R$

脚本文件:desc.txt

512 416 60
c 1 0 part0
c 1 15 part1
c 1 0 part2
c 1 0 part3
p 0 0 part4
c 1 0 part5

3.3 解释 desc.txt

512 416 60    宽x高=512x416, fps=60帧
c 1 0 part0   part0只播放1次,但需全部图片都播放,不能打断
c 1 15 part1  part1只播放1次,但需全部图片都播放,不能打断,在播放结束时延迟15帧,即15/fps=1/60=1/4秒
c 1 0 part2   part2只播放1次,但需全部图片都播放,不能打断
c 1 0 part3   part3只播放1次,但需全部图片都播放,不能打断
p 0 0 part4   part4循环播放,直到系统启动完成,收到boot completed信号即打断播放
c 1 0 part5   part5只播放1次,但需全部图片都播放,不能打断

3.4 谷歌原文:desc.txt

The first line defines the general parameters of the animation:

WIDTH HEIGHT FPS [PROGRESS]

WIDTH: animation width (pixels)
HEIGHT: animation height (pixels)
FPS: frames per second, e.g. 60
PROGRESS: whether to show a progress percentage on the last part
    The percentage will be displayed with an x-coordinate of ‘c’, and a y-coordinate set to 1/3 of the animation height.

It is followed by a number of rows of the form:

TYPE COUNT PAUSE PATH [FADE [#RGBHEX [CLOCK1 [CLOCK2]]]]

TYPE: a single char indicating what type of animation segment this is:
    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
COUNT: how many times to play the animation, or 0 to loop forever until boot is complete
PAUSE: number of FRAMES to delay after this part ends
PATH: directory in which to find the frames for this part (e.g. part0)
FADE: (ONLY FOR f TYPE) number of frames to fade out when interrupted where 0 means immediately which makes f ... 0 behave like p and doesn't count it as a fading part

…… OPTIONS 配置……省略……

.

3.5 ZIP打包

3.5.1 命令
cd <path-to-pieces>
zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*
3.5.2 用法举例
  1. 切换到bootanimation目录
  2. 执行zip命令
  3. 在bootanimation的上一级目录,获取bootanimation.zip
szhou@bcsrv01:~/bootanimation$ zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*
szhou@bcsrv01:~/bootanimation$ ls -al ../
total 92
drwx------ 4 szhou szhou  4096 8月  11 11:07 .
drwxr-xr-x 7 szhou szhou  4096 8月  11 10:14 ..
drwx------ 5 szhou szhou  4096 8月  10 15:26 bootanimation
-rw-rw-r-- 1 szhou szhou 77767 8月  11 11:07 bootanimation.zip --> 在上级目录生成ZIP
drwx------ 3 szhou szhou  4096 8月  11 10:12 R
szhou@bcsrv01:~/bootanimation$

最后,将bootanimation.zip复制到U盘上

4. 上机测试

4. 1 部署的路径

下面两个目录都可以用于简单测试,任选其一

  • /system/media/bootanimation.zip
  • /oem/media/bootanimation.zip

我们将部署到oem目录下做测试

4. 2 部署的命令

此处使用串口连接到开发板上
若使用adb,可使用$adb shell获得bash shell环境,即可直接执行下面命令

su
mount -o remount,rw /
mkdir /oem/media
chmod 755 /oem/media
cp /mnt/xxx/bootanimation.zip /oem/media/bootanimation.zip
sync
reboot

4. 3 效果

reboot重启后,即可看到开机动画的效果
在这里插入图片描述

.

5. 集成到AOSP源码中

基于android P,使用的是联发科平台,请根据自己的平台切换对应目录,若不确定,可使用find命令查找下文件名

  1. 将ZIP文件放置于下面目录
    aosp/vendor/mediatek/proprietary_tv/open/product/m7642/preinstall/bootanimation.zip

  2. 修改makefile文件
    aosp/vendor/mediatek/proprietary_tv/open/product/m7642/preinstall/preinstall.mk

在编译时候,将ZIP复制到对应的目录下:

PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/bootanimation.zip:/system/media/bootanimation.zip

或者

PRODUCT_COPY_FILES += \
     $(LOCAL_PATH)/bootanimation.zip:/oem/media/bootanimation.zip

.

6. 谷歌原文地址

安卓原文:BootAnimationFormat

.

7. 关于 options 参数

本文描述的内容,已基本够用,网络上的文章,大多都提及了上文所述的内容,但还有OPTION部分,很少有人去写,本想研究一下感兴趣的[PROGRESS],但……

WIDTH HEIGHT FPS [PROGRESS]

源码中查找PROGRESS参数的足迹

  • 下面此函数用于解析desc.txt文件
//路径: frameworks\base\cmds\bootanimation\BootAnimation.cpp
bool BootAnimation::parseAnimationDesc(Animation& animation)
{
   
   
    String8 desString;

    if (!readFile(animation.zip, "desc.txt", desString)) {
   
   
        return false;
    }
  • 但从Animation类的成员变量看,并未提供PROGRESS的解析
    struct Animation {
   
   
        struct Frame {
   
   
            String8 name;
            FileMap* map;
            int trimX;
            int trimY;
            int trimWidth;
            int trimHeight;
            mutable GLuint tid;
            bool operator < (const Frame& rhs) const {
   
   
                return name < rhs.name;
            }
        };
        struct Part {
   
   
            int count;  // The number of times this part should repeat, 0 for infinite
            int pause;  // The number of frames to pause for at the end of this part
            int clockPosX;  // The x position of the clock, in pixels. Positive values offset from
                            // the left of the screen, negative values offset from the right.
            int clockPosY;  // The y position of the clock, in pixels. Positive values offset from
                            // the bottom of the screen, negative values offset from the top.
                            // If either of the above are INT_MIN the clock is disabled, if INT_MAX
                            // the clock is centred on that axis.
            String8 path;
            String8 trimData;
            SortedVector<Frame> frames;
            bool playUntilComplete;
            float backgroundColor[3];
            uint8_t* audioData;
            int audioLength;
            Animation* animation;
        };
        int fps;
        int width;
        int height;
        Vector<Part> parts;
        String8 audioConf;
        String8 fileName;
        ZipFileRO* zip;
        Font clockFont;
    };
  • 所以,从源码的简单分析看,PROGRESS参数看样子无法使用,在测试中添加相关参数,看样子是被直接忽略掉了。后续有时间再继续分析,有知道的同学,可以备注下~
相关文章
|
7月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
320 30
|
7月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
529 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
7月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
232 3
|
7月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
334 65
Android自定义view之网易云推荐歌单界面
|
7月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
675 84
|
7月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
349 65
|
5月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
370 11
|
7月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
215 26
|
7月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
200 3

热门文章

最新文章