Jimmy Chen

A Programmer

(原创)Android充电动画分析

  今天来分析一下Android的关机充电动画是如何实现的。至于充电启动的流程,之后有时间再做分析,这里主要分析跟Android关机充电相关的部分。不多说直接开始分析代码吧。

healthd_mode_charger_init

  首先是healthd_mode_charger.cpp文件的healthd_mode_charger_init函数,这个函数是充电模式animation的初始化函数

init_animation

  init_animation函数同样在healthd_mode_charger.cpp文件中。

parse_animation_desc

  parse_animation_desc函数在AnimationParser.cpp文件中

这里因为公司使用的是将gif动画切出来的一张张独立的图,不像默认动画battery_scale.png图那样,一张图包含所有的充电动画surface信息,所以这里我们可以修改这个函数:

  1. 在animation结构体里面的frame结构体中添加一个string类型的字段frame_file,用来记录对应的frame文件名
  2. 修改frame: 这个prefix的解析内容,添加frame文件的文件名字段解析,例如:frame: 50 16 20 charger/charging_animation_09,将最后的charger/charging_animation_09内容记录到新添加的frame_file字段中
  3. 根据frame_file指定的文件名,通过res_create_display_surface函数来为每一帧动画图创建对应的frame,因为animation的frames指针就是用来记录动画内容的,所以将创建的frame记录到frames中即可。
  4. 需要注意注释掉healthd_mode_charger_init函数中通过charger/scale创建muti frame的代码

remove_prefix

  remove_prefix函数同样在AnimationParser.cpp文件中

  到这里,动画的初始化过程就基本讲完了,不过还有一个需要注意的地方就是,在调用res_create_display_surface的时候会调用open_png函数来打开png图片,在这个函数里面会判断png图片是否符合要求

从上面一段代码可以看出,animation动画图支持3通道的RGB图,4通道的RGBA类型的图是支持不了的,这里的A指的是Alpha通道;另外就是单通道灰阶图也是支持的。下面分析一下动画显示过程

update_screen_state

  动画显示无非就是判断当前电池的状态,然后选择到对应的frame,再通过healthd_draw显示到屏幕上面。下面我们再简单看看healthd_draw的redraw_screen方法

所以,动画的连续显示也显得比较简单。如果想要做修改,理清显示流程即可。

另外,看上面的流程可以知道,如果需要显示电量百分比,可以提供对应的font字体文件,当然更简单的就是提供一到十和百分号的png图,然后按照上面解析动画的流程一样,将百分比对应的图片也加载进来,最后显示即可。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注