VenusDrawable-以描述文件的方式绘制Bitmap动画

前言

参考矢量动画实现,帧动画。发现帧动画中load一系列的资源图片,创建大量的BitmapDrawable,资源图片存在重复的元素。这样不仅浪费了大量的手机内存,占用CPU时间片做计算,而且也无形中增大了App的大小。而安卓的矢量动画的实现,则摆脱了对位图的依赖,以描述性语句的形式来实现动画。但是有些场景下单纯用矢量绘图的方式又显得格外的复杂。
由此便产生了VenusDrawable,VenusDrawable的具体实现便是:将图片元素切分,通过将每个元素的绘制路径 描述出来,在画布上绘制,实现 位图动画。
类似 airbnb 的 lottie ,最近 SVGAPlayer (yyued开源的)。

效果展示

可以动的小蚂蚁
可以旋转的小动物

Drawable 实现

VenusDrawable 的实现部分比较简单,大概的流程图如下:

实现流程

整个的实现流程比较简单,核心内容是按照帧序列的方式将位图和矢量图绘制到View上,系分一下大概分以下几个部分:

描述数据的格式

使用json这种轻量级的方式来表述,大概的格式如下:

{
    "version": "1.0",//版本描述
    "count": 60,//总帧数
    "size": {//大小
        "width": 500,
        "height": 500
    },
    "frames": [
      {
            "key": "位图字符或矢量标志",//元素类型
            "layout": {//元素大小
                "x": 14,
                "y": 14
            }
            "sprites": [
                {
                    "index": 0,//序列为0 的帧
                    "martix": {/**位图位置描述或矢量描述**/},
                },
                ......
            ]
        },
        ......
    ]
}

其中,若动画元素中使用到图片,我们可以将其转化为字符存储到描述文件中。

描述数据的序列化和反序列化

单纯通过json的方式是可以实现整个流程的,但是json的序列化和反序列化效率不是很高,特别在移动设备上,更加的追求效率,因此VenusDrawable 采用了FlatBuffers 实现序列化和反序列化。


i效率对比

绘制流程实现

VenusDrawable 实现

将描述文件解析后,传递给VenusDrawable,由其中的VenusDrawer 绘制到View上面canvas.drawBitmap,其中VenusValueAnimator控制帧绘制的速率。

AE拓展实现

对AE拓展比较陌生的话,可以看下AE 扩展开发系统教程,实现AE拓展的目的:为了高保真的将动画效果由设计师直达软件界面,类似于lottie的一些插件。不仅可以减少开发成本,还可以提高工作效率。

CEP 架构

我们需要实现AE拓展大概描述一下:将设计师设计并输出的.aep文件转换成我们能识别的flatbuffers文件结构
带着这个目的,我们需要完成两部分工作:

 1. 和我们的宿主程序(AE)的交互:通过宿主提供的功能(api接口),将.aep文件拆解,获取我们所需要的信息。
 2. 另一部分则是我们拓展的展现逻辑:写一个html,使用js做文件的生成操作。

而这两部分则通过CSInterface.js 联系在一起。

第一部分可以直接查阅API使用;
第二部分大致流程图如下:

生成最终文件流程

效率对比

相同条件下,用了两个小蚂蚁的动画,一个是通过AnimationDrawable 实现,另外一个通过VenusDrawable实现,gc后对比图如下:
VenusDrawable:
[图片上传失败...(image-a2a13f-1557552400900)]

AnimationDrawable:
[图片上传失败...(image-6f3321-1557552400900)]

对比可发现:相较于AnimationDrawable,VenusDrawable减少了近1m的内存占用。

后续优化

  1. 在多机型上的兼容性问题,硬件绘制的兼容性问题。
  2. 增加x元素来影响 动画的呈现,如手势,touch 事件等,使动画更具趣味性。
  3. 绘制的效率持续调优。
  4. 支持矢量动画的绘制

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容