Giter Site home page Giter Site logo

bodymovin-to-avd's Introduction

Lottie for Web, Android, iOS, React Native, and Windows

Lottie is a mobile library for Web, and iOS that parses Adobe After Effects animations exported as json with Bodymovin and renders them natively on mobile!

For the first time, designers can create and ship beautiful animations without an engineer painstakingly recreating it by hand. They say a picture is worth 1,000 words so here are 13,000:

View documentation, FAQ, help, examples, and more at airbnb.io/lottie

Example1

Example2

Example3

Community

Example4

Plugin installation

Option 1 (Recommended):

Download it from from aescripts + aeplugins: https://aescripts.com/bodymovin/

Option 2:

Or get it from the adobe store https://exchange.adobe.com/creativecloud.details.12557.html CC 2014 and up.

Other installation options:

Option 3:

  • download the ZIP from the repo.
  • Extract content and get the .zxp file from '/build/extension'
  • Use the ZXP installer from aescripts.com.

Option 4:

  • Close After Effects

  • Extract the zipped file on build/extension/bodymovin.zxp to the adobe CEP folder:
    WINDOWS:
    C:\Program Files (x86)\Common Files\Adobe\CEP\extensions or
    C:\<username>\AppData\Roaming\Adobe\CEP\extensions
    MAC:
    /Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    (you can open the terminal and type:
    $ cp -R YOURUNZIPEDFOLDERPATH/extension /Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    then type:
    $ ls /Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    to make sure it was copied correctly type)

  • Edit the registry key:
    WINDOWS:
    open the registry key HKEY_CURRENT_USER/Software/Adobe/CSXS.6 and add a key named PlayerDebugMode, of type String, and value 1.
    MAC:
    open the file ~/Library/Preferences/com.adobe.CSXS.6.plist and add a row with key PlayerDebugMode, of type String, and value 1.

Option 5:

Install the zxp manually following the instructions here: https://helpx.adobe.com/x-productkb/global/installingextensionsandaddons.html Skip directly to "Install third-party extensions"

Option 6:

Install with Homebrew-adobe:

brew tap danielbayley/adobe
brew cask install lottie

After installing

  • Windows: Go to Edit > Preferences > Scripting & Expressions... > and check on "Allow Scripts to Write Files and Access Network"
  • Mac: Go to Adobe After Effects > Preferences > Scripting & Expressions... > and check on "Allow Scripts to Write Files and Access Network"

Old Versions

  • Windows: Go to Edit > Preferences > General > and check on "Allow Scripts to Write Files and Access Network"
  • Mac: Go to Adobe After Effects > Preferences > General > and check on "Allow Scripts to Write Files and Access Network"

HTML player installation

# with npm
npm install lottie-web

# with bower
bower install bodymovin

Or you can use the script file from here: https://cdnjs.com/libraries/bodymovin Or get it directly from the AE plugin clicking on Get Player

Demo

See a basic implementation here.

Examples

See examples on codepen.

How it works

Here's a video tutorial explaining how to export a basic animation and load it in an html page

After Effects

  • Open your AE project and select the bodymovin extension on Window > Extensions > bodymovin
  • A Panel will open with a Compositions tab listing all of your Project Compositions.
  • Select the composition you want to export.
  • Select a Destination Folder.
  • Click Render
  • look for the exported json file (if you had images or AI layers on your animation, there will be an images folder with the exported files)

HTML

  • get the lottie.js file from the build/player/ folder for the latest build
  • include the .js file on your html (remember to gzip it for production)
<script src="js/lottie.js" type="text/javascript"></script>

You can call lottie.loadAnimation() to start an animation. It takes an object as a unique param with:

  • animationData: an Object with the exported animation data. Note: If your animation contains repeaters and you plan to call loadAnimation multiple times with the same animation, please deep clone the object before passing it (see #1159 and #2151.)
  • path: the relative path to the animation object. (animationData and path are mutually exclusive)
  • loop: true / false / number
  • autoplay: true / false it will start playing as soon as it is ready
  • name: animation name for future reference
  • renderer: 'svg' / 'canvas' / 'html' to set the renderer
  • container: the dom element on which to render the animation

It returns the animation instance you can control with play, pause, setSpeed, etc.

lottie.loadAnimation({
  container: element, // the dom element that will contain the animation
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'data.json' // the path to the animation json
});

Composition Settings:

Check this wiki page for an explanation for each setting. https://github.com/airbnb/lottie-web/wiki/Composition-Settings

Usage

Animation instances have these main methods:

play


stop


pause


setSpeed(speed)

  • speed: 1 is normal speed.

goToAndStop(value, isFrame)

  • value: numeric value.
  • isFrame: defines if first argument is a time based value or a frame based (default false).

goToAndPlay(value, isFrame)

  • value: numeric value.
  • isFrame: defines if first argument is a time based value or a frame based (default false).

setDirection(direction)

  • direction: 1 is forward, -1 is reverse.

playSegments(segments, forceFlag)

  • segments: array. Can contain 2 numeric values that will be used as first and last frame of the animation. Or can contain a sequence of arrays each with 2 numeric values.
  • forceFlag: boolean. If set to false, it will wait until the current segment is complete. If true, it will update values immediately.

setSubframe(useSubFrames)

  • useSubFrames: If false, it will respect the original AE fps. If true, it will update on every requestAnimationFrame with intermediate values. Default is true.

destroy()


getDuration(inFrames)

  • inFrames: If true, returns duration in frames, if false, in seconds.

Additional methods:

  • updateDocumentData -- updates a text layer's data More Info

Lottie has several global methods that will affect all animations:

lottie.play() -- with 1 optional parameter name to target a specific animation
lottie.stop() -- with 1 optional parameter name to target a specific animation
lottie.goToAndStop(value, isFrame, name) -- Moves an animation with the specified name playback to the defined time. If name is omitted, moves all animation instances.
lottie.setSpeed() -- first argument speed (1 is normal speed) -- with 1 optional parameter name to target a specific animation
lottie.setDirection() -- first argument direction (1 is normal direction.) -- with 1 optional parameter name to target a specific animation
lottie.searchAnimations() -- looks for elements with class "lottie" or "bodymovin"
lottie.loadAnimation() -- Explained above. returns an animation instance to control individually.
lottie.destroy(name) -- Destroys an animation with the specified name. If name is omitted, destroys all animation instances. The DOM element will be emptied.
lottie.registerAnimation() -- you can register an element directly with registerAnimation. It must have the "data-animation-path" attribute pointing at the data.json url
lottie.getRegisteredAnimations() -- returns all animations instances
lottie.setQuality() -- default 'high', set 'high','medium','low', or a number > 1 to improve player performance. In some animations as low as 2 won't show any difference.
lottie.setLocationHref() -- Sets the relative location from where svg elements with ids are referenced. It's useful when you experience mask issues in Safari.
lottie.freeze() -- Freezes all playing animations or animations that will be loaded
lottie.unfreeze() -- Unfreezes all animations
lottie.inBrowser() -- true if the library is being run in a browser
lottie.resize() -- Resizes all animation instances

Events

  • onComplete
  • onLoopComplete
  • onEnterFrame
  • onSegmentStart

you can also use addEventListener with the following events:

  • complete
  • loopComplete
  • drawnFrame
  • enterFrame
  • segmentStart
  • config_ready (when initial config is done)
  • data_ready (when all parts of the animation have been loaded)
  • data_failed (when part of the animation can not be loaded)
  • loaded_images (when all image loads have either succeeded or errored)
  • DOMLoaded (when elements have been added to the DOM)
  • destroy

Other loading options

  • if you want to use an existing canvas to draw, you can pass an extra object: 'rendererSettings' with the following configuration:
lottie.loadAnimation({
  container: element, // the dom element
  renderer: 'svg',
  loop: true,
  autoplay: true,
  animationData: animationData, // the animation data
  // ...or if your animation contains repeaters:
  // animationData: cloneDeep(animationData), // e.g. lodash.clonedeep
  rendererSettings: {
    context: canvasContext, // the canvas context, only support "2d" context
    preserveAspectRatio: 'xMinYMin slice', // Supports the same options as the svg element's preserveAspectRatio property
    title: 'Accessible Title', // Adds SVG title element for accessible animation title
    description: 'Accessible description.', // Adds SVG desc element for accessible long description of animation
    clearCanvas: false,
    progressiveLoad: false, // Boolean, only svg renderer, loads dom elements when needed. Might speed up initialization for large number of elements.
    hideOnTransparent: true, //Boolean, only svg renderer, hides elements when opacity reaches 0 (defaults to true)
    className: 'some-css-class-name',
    id: 'some-id',
  }
});

Doing this you will have to handle the canvas clearing after each frame
Another way to load animations is adding specific attributes to a dom element. You have to include a div and set it's class to "lottie". If you do it before page load, it will automatically search for all tags with the class "lottie". Or you can call lottie.searchAnimations() after page load and it will search all elements with the class "lottie".

  • Add the data.json to a folder relative to the html
  • Create a div that will contain the animation.
  • Required
    • A class called "lottie"
    • A "data-animation-path" attribute with relative path to the data.json
  • Optional
    • A "data-anim-loop" attribute
    • A "data-name" attribute to specify a name to target play controls specifically

Example

 <div style="width:1067px;height:600px"  class="lottie" data-animation-path="animation/" data-anim-loop="true" data-name="ninja"></div>

Preview

You can preview or take an svg snapshot of the animation to use as poster. After you render your animation, you can take a snapshot of any frame in the animation and save it to your disk. I recommend to pass the svg through an svg optimizer like https://jakearchibald.github.io/svgomg/ and play around with their settings.

Recommendations

Files

If you have any images or AI layers that you haven't converted to shapes (I recommend that you convert them, so they get exported as vectors, right click each layer and do: "Create shapes from Vector Layers"), they will be saved to an images folder relative to the destination json folder. Beware not to overwrite an existing folder on that same location.

Performance

This is real time rendering. Although it is pretty optimized, it always helps if you keep your AE project to what is necessary
More optimizations are on their way, but try not to use huge shapes in AE only to mask a small part of it.
Too many nodes will also affect performance.

Help

If you have any animations that don't work or want me to export them, don't hesitate to write.
I'm really interested in seeing what kind of problems the plugin has.
my email is [email protected]

AE Feature Support

  • The script supports precomps, shapes, solids, images, null objects, texts
  • It supports masks and inverted masks. Maybe other modes will come but it has a huge performance hit.
  • It supports time remapping
  • The script supports shapes, rectangles, ellipses and stars.
  • Expressions. Check the wiki page for more info.
  • Not supported: image sequences, videos and audio are not supported
  • No negative layer stretching! No idea why, but stretching a layer messes with all the data.

Development

npm install or bower install first npm start

Notes

  • If you want to modify the parser or the player, there are some gulp commands that can simplify the task
  • look at the great animations exported on codepen See examples on codepen.
  • gzipping the animation jsons and the player have a huge reduction on the filesize. I recommend doing it if you use it for a project.

Issues

  • For missing mask in Safari browser, please call lottie.setLocationHref(locationHref) before animation is generated. It usually caused by usage of base tag in html. (see above for description of setLocationHref)

Contributors

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

bodymovin-to-avd's People

Contributors

alexkgwyn avatar bodymovin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

alexkgwyn

bodymovin-to-avd's Issues

Support gradient in AVD

Gradient in vector drawable has been supported since API 24, any plan to support that?

An example with gradient inside AVD.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="262dp"
    android:height="264dp"
    android:viewportWidth="262"
    android:viewportHeight="264">
  <path
      android:pathData="m44.698,97.984l77.922,0l24.078,-74.102l24.078,74.102l77.922,0l-63.04,45.797l24.08,74.102l-63.04,-45.798l-63.04,45.798l24.08,-74.102l-63.04,-45.797z"
      android:strokeAlpha="null"
      android:strokeWidth="1.5"
      android:strokeColor="#000">
    <aapt:attr name="android:fillColor">
      <gradient 
          android:startY="23.882004"
          android:startX="44.697998"
          android:endY="23.882004"
          android:endX="248.698"
          android:type="linear">
        <item android:offset="0" android:color="#FF00BF5F"/>
        <item android:offset="1" android:color="#FFFF40A0"/>
      </gradient>
    </aapt:attr>
  </path>
</vector>

Path not exported to AVD

Hello again.

So, i managed to do the thing that i wanted, but now i have another issue.
I have an .aep with 3 paths, ready to be imported to Android Studio.

When exporting to JSON and importing it in Lottie, the animation works with no flaws.
But when exporting to AVD, the app crashes when trying to load it.

I think this is because there are no paths in the AVD

The JSON, AVD and .aep are attached

Thanks in advance!
Desktop.zip

Effects are not exported

Hi there!

So, I have a project that i'm working on, and I added Turbulent Displace to 2 layers out of 3. I edited the layers after my liking, and exported the project using bodymovin as AVD.

The problem is, that the exported file in not animated in any way, and i am struggling to understand why.
Not even when exported as a Demo, the animations (effects, don't work)

Please advise.
Thank you in advance!

PS: the .aep file is attached
blurb.zip

Trim Path Animations not exported as XML

I'm trying to export this animation from AE using Bodymovin.

I need it to be as a XML, but for some reason the parts of the animation using trim path doesn't work (It does however work just fine when I export it as a lottie and preview it in the browser, every part of the animation is included)

But when I try to export it as XML, the first part of the animation (which is a simple checkmark, done with trim path) refuses to be exported. I've been banging my head with this for about 2 weeks now.

Here's a snapshot of my settings and I'm running AE 2022 Version 22.5.0 (Build 53)

Screenshot 2022-06-28 at 13 34 33

Link to the AE file: https://drive.google.com/file/d/1Q8xsAZotdhgpnMCFjMpptcK_SW3LnznX/view?usp=sharing

Help and assistance to whats causing it would be very much appreciated.

Exporting error due to too many path animations in one layer?

Hi,
I’ve made a quite simple loading animation. It’s just a compound path with three circles cut out of a rectangle and all I’m doing is animating the path of the three circles:

Screenshot 2020-07-18 at 12 04 59

Screenshot 2020-07-18 at 12 05 20

The Lottie export works just fine. But if I wanna export the animation as AVD, I get this error:


Screenshot 2020-07-18 at 12 03 21

Which is strange, since the option is turned on and I already exported multiple other icons with no problems. Just this one doesn’t wanna work. 

I tried to export dot by dot to figure out if it’s a problem with the path animation I did. But separated every single dot can be exported with no problem. It seems that the error only occurs if I want to export all three dots at the same time (any two dots at the same time are no problem either.)

Is it possible that there are "too many" path animations in one layer?
And is there a workaround for my problem? Since I need to cut out those three dots, I cannot think of another way to do the animation? (since alpha mattes and subtracted masks are not supported for AVD export?)

Thanks

(If you wanna take a look at the AE file: https://drive.google.com/file/d/1kSRVMb90tHlebkXxIDmp2QVKGcJEveSF/view?usp=sharing)

Add Install and Run Readme

Suggest to add install and run instruction, I don't have permission to push to a branch so I paste them here

bodymovin-to-avd

Bodymovin to AVD converter

Install

  1. Clone the project
  2. npm install

Run

  1. Save below code as run.js
  2. Store Lottie animation json file in the project
  3. Run node run.js

Example of usage

var avd_converter = require('./src/index.js');
var fs = require('fs');

fs.readFile("./data.json",  "utf8",  function(error, data){
	process.on('unhandledRejection', function(err, promise) {
	    console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
	});
	var prom = avd_converter(JSON.parse(data))
	prom.then(function(xml){
		fs.writeFile("./test.xml", xml, function(err) {
		    if(err) {
		        return console.log(err);
		    }

		    console.log("The file was saved!");
		}); 
	}).catch(function(err){
	 		console.log('catch');
 	});
	
})

Stroke line cap misinterpretation

Bodymoving is misinterpreting the stroke line caps and the line joins. When exporting vector shape animations to AVD. They all become round instead of the selected value in After Effects.

artboard 1

Invalid SVG paths

bodymovin-to-avd seems to be creating bad SVG path data.

pathData.js has code to add a ‘c’ command without coordinates to the end:

if(data.c) {
pt = matrix.transformPoint(data.o[i][0] + data.v[i][0], data.o[i][1] + data.v[i][1]);
pathValue += ' C' + roundValue(pt[0]) + ',' + roundValue(pt[1]);
pt = matrix.transformPoint(data.i[0][0] + data.v[0][0], data.i[0][1] + data.v[0][1]);
pathValue += ' ' + roundValue(pt[0]) + ',' + roundValue(pt[1]);
pt = matrix.transformPoint(data.v[0][0], data.v[0][1]);
pathValue += ' ' + roundValue(pt[0]) + ',' + roundValue(pt[1]);
pathValue += 'c';
}

If the intention is to close the path, then the real SVG command is ‘Z’.

Interestingly, Android accepts the currently generated invalid paths. However, if the paths are viewed in a web browser, then only the first subpath is visible if the path is made of multiple subpaths. Here’s an example path with multiple subpaths: “ M10 20 C10,5 20,5 30,30c M20 20 C10,5 20,5, 30,0c ”. The invalid commands are highlighted.

Is there documentation on what After Effects features are supported with Bodymovin export to AVD?

Hi - Bodymovin has been really helpful for exporting Lotties and AVDs, thanks so much for the development! Not sure if this is the right place to ask, but I've been running into various issues with After Effects exports using the Bodymovin extension into Lotties and AVDs, and they seem to have to do with what AE features designers use when building the animations.

Lottie has a list of supported features at https://lottiefiles.com/supported-features. Is there a list of After Effects features supported by Bodymovin AVD? That would be really helpful when deciding whether to use Lottie vs AVD and how to build them smoothly.

Thank you very much!

Any update?

Could you please provide an update on the status of this project? I've noticed that we're now in the era of Lottie format version 6, yet the last commit for this project took place in 2019. It would seem that the project might not be completely in sync with the current Lottie file format. Your assistance in clarifying this would be greatly appreciated.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.