-
-
Save Jpoliachik/0dd83689646d1051b0bc to your computer and use it in GitHub Desktop.
| 'use strict'; | |
| import React, { | |
| AppRegistry, | |
| Component, | |
| StyleSheet, | |
| Text, | |
| View, | |
| TouchableOpacity, | |
| LayoutAnimation, | |
| } from 'react-native'; | |
| var CustomLayoutAnimation = { | |
| duration: 200, | |
| create: { | |
| type: LayoutAnimation.Types.linear, | |
| property: LayoutAnimation.Properties.opacity, | |
| }, | |
| update: { | |
| type: LayoutAnimation.Types.curveEaseInEaseOut, | |
| }, | |
| }; | |
| class AnimationExample extends Component { | |
| constructor() { | |
| super(); | |
| this.state = { | |
| index: 0, | |
| } | |
| } | |
| onPress(index) { | |
| // Uncomment to animate the next state change. | |
| LayoutAnimation.configureNext(LayoutAnimation.Presets.spring); | |
| // Or use a Custom Layout Animation | |
| // LayoutAnimation.configureNext(CustomLayoutAnimation); | |
| this.setState({index: index}); | |
| } | |
| renderButton(index) { | |
| return ( | |
| <TouchableOpacity key={'button' + index} style={styles.button} onPress={() => this.onPress(index)}> | |
| <Text>{index}</Text> | |
| </TouchableOpacity> | |
| ); | |
| } | |
| renderCircle(key) { | |
| var size = 50; | |
| return ( | |
| <View key={key} style={{width: size, height: size, borderRadius: size / 2.0, backgroundColor: 'sandybrown', margin: 20}}/> | |
| ); | |
| } | |
| render() { | |
| var leftStyle = this.state.index === 0 ? {flex: 1} : {width: 20}; | |
| var middleStyle = this.state.index === 2 ? {width: 20} : {flex: 1}; | |
| var rightStyle = {flex: 1}; | |
| var whiteHeight = this.state.index * 80; | |
| var circles = []; | |
| for (var i = 0; i < (5 + this.state.index); i++) { | |
| circles.push(this.renderCircle(i)); | |
| } | |
| return ( | |
| <View style={styles.container}> | |
| <View style={styles.topButtons}> | |
| {this.renderButton(0)} | |
| {this.renderButton(1)} | |
| {this.renderButton(2)} | |
| </View> | |
| <View style={styles.content}> | |
| <View style={{flexDirection: 'row', height: 100}}> | |
| <View style={[leftStyle, {backgroundColor: 'firebrick'}]}/> | |
| <View style={[middleStyle, {backgroundColor: 'seagreen'}]}/> | |
| <View style={[rightStyle, {backgroundColor: 'steelblue'}]}/> | |
| </View> | |
| <View style={{height: whiteHeight, justifyContent: 'center', alignItems: 'center', overflow: 'hidden'}} removeClippedSubviews={true}> | |
| <View> | |
| <Text>Stuff Goes Here</Text> | |
| </View> | |
| </View> | |
| <View style={styles.circleContainer}> | |
| {circles} | |
| </View> | |
| </View> | |
| </View> | |
| ); | |
| } | |
| } | |
| const styles = StyleSheet.create({ | |
| container: { | |
| flex: 1, | |
| justifyContent: 'center', | |
| alignItems: 'center', | |
| backgroundColor: '#F5FCFF', | |
| }, | |
| topButtons: { | |
| marginTop: 22, | |
| flexDirection: 'row', | |
| alignItems: 'center', | |
| justifyContent: 'center', | |
| alignSelf: 'stretch', | |
| backgroundColor: 'lightblue', | |
| }, | |
| button: { | |
| flex: 1, | |
| height: 60, | |
| alignSelf: 'stretch', | |
| backgroundColor: 'white', | |
| alignItems: 'center', | |
| justifyContent: 'center', | |
| margin: 8, | |
| }, | |
| content: { | |
| flex: 1, | |
| alignSelf: 'stretch', | |
| }, | |
| circleContainer: { | |
| flexDirection: 'row', | |
| flex: 1, | |
| flexWrap: 'wrap', | |
| padding: 30, | |
| justifyContent: 'center', | |
| alignItems: 'center' | |
| }, | |
| }); | |
| AppRegistry.registerComponent('AnimationExample', () => AnimationExample); |
RN 0.56
`
import React, { Component } from 'react'; // Import
import {
AppRegistry,
StyleSheet,
Text,
View,
TouchableOpacity,
LayoutAnimation,
UIManager,
} from 'react-native';
let CustomLayoutAnimation = {
duration: 200,
create: {
type: LayoutAnimation.Types.linear,
property: LayoutAnimation.Properties.opacity,
},
update: {
type: LayoutAnimation.Types.easeInEaseOut, //Change Type
},
};
//Add this part for work in android
UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true);
export default class App extends React.Component {
constructor() {
super();
this.state = {
index: 0,
}
}
`
I made a working snack based on this gist. https://snack.expo.io/@thg303/reactnative-layoutanimation
Amazing
Thank you, was using Animated LIbrary which was getting me nowhere. The next option was create the entire component in Java which I might have well created the whole app in Java if RN was so limited. This really helped, thanks again.
Having issues with the linear animation, where I get an error message saying: "Missing interpolation type", did I miss something? or are others having the same issue?
Update: the example of a custom linear based animation uses a "curveEaseInEaseOut" as a type of layoutanimation.type. enum in the update param of the custom layout, if you look at the source, the enum options are,
const TypesEnum = {
spring: true,
linear: true,
easeInEaseOut: true,
easeIn: true,
easeOut: true,
keyboard: true,
};
change that and you will be fine.