Airbnb 动画库Lottie

在Android和iOS上机器上渲染After Effects动画的工具

Lottie 支持Android, iOSReact Native,本片文章介绍在Android中使用Lottie。

例子apk下载

Lottie 是一个可以解析AE( Adobe After Effects )上的插件Bodymovin导出的json文件并且能在移动设备上渲染的一个android和ios动画库。

首先设计师能创建出美丽的动画,而不需要工程师用代码手写创建它。这样效率可以大大的提升。

所有这些动画都是在After Effects中创建的,使用Bodymovin导出,并且无需额外的工程师工作即可完成原生渲染。

Bodymovin是一个又Hernan Torrisi 创建的After Effects插件,导出文件格式为json和包括一个javascript网络播放器。 我们建立在他的肩上将其使用扩展到Android,iOS和React Native平台上。

了解更多请访问我们的博客

示例App

你能自己创建例子app和从playstore下载。例子app包括一些基本的动画但也允许你使用本地存储的和网络现在的json文件。

下载

Gradle是唯一支持的构建配置方式,因此只需将依赖项添加到项目build.gradle文件中即可:

dependencies {
compile 'com.airbnb.android:lottie:1.0.1'
}

使用Lottie

Lottie支持Jellybean(API 16)及以上。LottieAnimationView是使用它的最简单的方法:

 <com.airbnb.lottie.LottieAnimationView
     android:id="@+id/animation_view"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     app:lottie_fileName="hello-world.json"
     app:lottie_loop="true"
     app:lottie_autoPlay="true" />

在众多方法中你还可以使用程序的方式, 即从app / src / main / assets中的读取json文件:

LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
animationView.setAnimation("hello-world.json");
animationView.loop(true);

接下来这种方法将加载文件放在后台异步解析动画json文件,并在完成后呈现动画。

如果你想重用一个从列表中选择的或者网络请求的JSONObject 你可以这样

LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
...
LottieComposition composition = LottieComposition.fromJson(getResources(), jsonObject, (composition) -> {
animationView.setComposition(composition);
animationView.playAnimation();
});

然后你还可以自己控制这个动画或者添加监听器:

animationView.addAnimatorUpdateListener((animation) -> {
// Do something.
});
animationView.playAnimation();
...
if (animationView.isAnimating()) {
// Do something.
}
...
animationView.setProgress(0.5f);
...

// Custom animation speed or duration.
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)
.setDuration(500);
animator.addUpdateListener(animation -> {
animationView.setProgress(animation.getAnimatedValue());
});
animator.start();
...
animationView.cancelAnimation();

其实在这个库中LottieAnimationView 通过LottieDrawable来渲染动画的。如果你需要你可以直接使用drawable形式:

LottieDrawable drawable = new LottieDrawable();
LottieComposition.fromAssetFileName(getContext(), "hello-world.json", (composition) -> {
drawable.setComposition(composition);
});

如果你的动画将被频繁重用,LottieAnimationView有一个可选的缓存策略内置。使用#LottieAnimationView#setAnimation(String,CacheStrategy)。 CacheStrategy可以是Strong,Weak或None三种形式来让LottieAnimationView对加载和解析动画的使用强或弱引用的方式。

支持的After Effects功能

Keyframe Interpolation

  1. Linear Interpolation
  2. Bezier Interpolation
  3. Hold Interpolation
  4. Rove Across Time
  5. Spatial Bezier

Solids

  1. Transform Anchor Point
  2. Transform Position
  3. Transform Scale
  4. Transform Rotation
  5. Transform Opacity

Masks

  1. Path
  2. Opacity
  3. Multiple Masks (additive)

Track Mattes

Alpha Matte

Parenting

  1. Multiple Parenting
  2. Nulls

Shape Layers

Anchor Point
Position
Scale
Rotation
Opacity
Path
Group Transforms (Anchor point, position, scale etc)
Rectangle (All properties)
Elipse (All properties)
Multiple paths in one group

Stroke (shape layer)

Stroke Color
Stroke Opacity
Stroke Width
Line Cap
Dashes

Fill (shape layer)

Fill Color
Fill Opacity

Trim Paths (shape layer)

Trim Paths Start
Trim Paths End
Trim Paths Offset

性能和内存

如果LottieAnimationView 的composition 没有masks或mattes,那么性能和内存开销应该相当不大。没有创建位图,大多数操作都是简单的画布操作。
如果合成具有遮罩,则将在合成大小处创建2-3个位图。当动画视图添加到窗口时,位图由lottie自动创建,并在从窗口中删除时重新生成。因此,不建议在RecyclerView中使用带有masks或mattes的动画,因为它会导致显着的位图流失。除了内存流失之外,额外的bitmap.eraseColor()和canvas.drawBitmap()调用对于masks和mattes是必要的,这将降低动画的性能。对于简单动画,性能命中不应该大到足以在实际使用时明显。如果您在列表中使用动画,建议在LottieAnimationView.setAnimation(String,CacheStrategy)中使用CacheStrategy,因此动画不必每次都反序列化。

试试看

clone此库并运行LottieSample模块以查看一堆示例动画。 它们的JSON文件位于LottieSample / src / main / assets中,而orignal After Effects文件位于/ After Effects示例中

示例应用程序还可以在给定的URL或您设备上的本地加载json文件(如从网络下载或您本地的sdcard)。

社区贡献

Xamarin bindings
NativeScript bindings

备择方案

  1. 手动构建动画。 手动构建动画是Android和iOS设计和工程的巨大时间承诺。 经常很难,甚至不可能证明花费这么多时间来获得动画是正确的。
  2. Facebook Keyframes 。 Keyframes 是一个来自于Facebook美妙的的新动画库。 但是Keyframes 不支持的一些功能如面具,遮罩,修剪路径,虚线模式等但是Lottie可以。
  3. Gifs。 Gif是一个bodymovin JSON的大小的两倍,并且以固定的大小呈现,不能按比例放大以匹配大和高密度屏幕。
  4. Png帧动画。 这种比gif更糟糕,因为它们的文件大小通常是bodymovin json的大小的30-50倍,也不能放大。

为什么叫Lottie

Lottie以德国一个剪辑电影最出名的导演命名。 她最着名的电影是“Achmed王子的冒险”(1926年) - 最古老的feature-length动画电影,在Walt Disney's的feature-length白雪公主和七个小矮人(1937)之前十多年里的 The art of Lotte Reineger

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

推荐阅读更多精彩内容