Get started with Lottie by installing the node module with yarn or npm:
yarn add lottie-react-native@{{ book.reactNativeVersion }}
# or
npm i --save lottie-react-native@{{ book.reactNativeVersion }}
If you're using CocoaPods on iOS, you can put the following in your Podfile:
pod 'lottie-ios', :path => '../node_modules/lottie-ios'
pod 'lottie-react-native', :path => '../node_modules/lottie-react-native'If you're not using CocoaPods on iOS, you can use react-native link:
react-native link lottie-ios
react-native link lottie-react-nativeAfter this, open the Xcode project configuration and add the Lottie.framework as Embedded Binaries.
For android, you can react-native link as well:
react-native link lottie-react-nativeor you can add it manually:
settings.gradle:
include ':lottie-react-native'
project(':lottie-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/lottie-react-native/src/android')
build.gradle:
dependencies {
...
compile project(':lottie-react-native')
...
}
Lottie requires Android support library version 26. If you're using the react-native init
template, you may still be using 23. To change this, simply go to android/app/build.gradle and
find the compileSdkVersion option inside of the android block and change it to
android {
compileSdkVersion 26 // <-- update this to 26
// ...
You must also add the LottiePackage to getPackages() in your ReactApplication
import com.airbnb.android.react.lottie.LottiePackage;
...
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
...
new LottiePackage()
);
}
};Then, go to android/build.gradle and make sure it has :
allprojects {
repositories {
mavenLocal()
jcenter()
// Add the following 3 lines
maven {
url 'https://maven.google.com'
}
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
}
}
With this change you should be ready to go.
Lottie's animation progress can be controlled with an Animated value:
import React from 'react';
import { Animated, Easing } from 'react-native';
import LottieView from 'lottie-react-native';
export default class BasicExample extends React.Component {
constructor(props) {
super(props);
this.state = {
progress: new Animated.Value(0),
};
}
componentDidMount() {
Animated.timing(this.state.progress, {
toValue: 1,
duration: 5000,
easing: Easing.linear,
}).start();
}
render() {
return (
<LottieView source={require('../path/to/animation.json')} progress={this.state.progress} />
);
}
}Additionally, there is an imperative API which is sometimes simpler.
import React from 'react';
import LottieView from 'lottie-react-native';
export default class BasicExample extends React.Component {
componentDidMount() {
this.animation.play();
// Or set a specific startFrame and endFrame with:
this.animation.play(30, 120);
}
render() {
return (
<LottieView
ref={animation => {
this.animation = animation;
}}
source={require('../path/to/animation.json')}
/>
);
}
}You can check out the example project with the following instructions
- Clone the repo:
git clone https://github.com/airbnb/lottie-react-native.git - Open:
cd lottie-react-nativeand Install:npm install - Run
npm startto start the packager. ** The packager must be running to use the sample apps.** - In another CLI window, do the following:
For Running iOS:
- If you don't have CocoaPods installed, run
bundle install - Install pods:
npm run build:pods - Run Example:
npm run run:ios
For Running Android:
- Run Example:
npm run run:android
type AnimationProps = {
// The source of animation. Can be referenced as a local asset by a string, or remotely
// with an object with a `uri` property, or it can be an actual JS object of an
// animation, obtained (for example) with something like
// `require('../path/to/animation.json')`
source: string | AnimationJson | { uri: string },
// A number between 0 and 1, or an `Animated` number between 0 and 1. This number
// represents the normalized progress of the animation. If you update this prop, the
// animation will correspondingly update to the frame at that progress value. This
// prop is not required if you are using the imperative API.
progress: number | Animated = 0,
// The speed the animation will progress. This only affects the imperative API. The
// default value is 1.
speed: number = 1,
// A boolean flag indicating whether or not the animation should loop.
loop: boolean = false,
// Style attributes for the view, as expected in a standard `View`:
// http://facebook.github.io/react-native/releases/0.39/docs/view.html#style
// CAVEAT: border styling is not supported.
style?: ViewStyle,
// [Android] Relative folder inside of assets containing image files to be animated.
// Make sure that the images that bodymovin export are in that folder with their names unchanged (should be img_#).
// Refer to https://github.com/airbnb/lottie-android#image-support for more details.
imageAssetsFolder: string,
};
Methods:
class Animation extends React.Component {
// play the animation all the way through, at the speed specified as a prop.
play();
// Reset the animation back to `0` progress.
reset();
}
If you are trying to run pod install and you get:
[!] Unable to find a specification for `lottie-ios`
Run pod repo update and retry.
When your build fails with:
LottieReactNative/LRNContainerView.h: 'Lottie/Lottie.h' file not found
Add the Lottie.framework to the Embedded Binaries in your Xcode project configuration.