/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow
*/
'use strict';
const React = require('react');
const ReactNative = require('react-native');
const {LayoutAnimation, StyleSheet, Text, View, TouchableOpacity} = ReactNative;
class AddRemoveExample extends React.Component<{}, $FlowFixMeState> {
state = {
views: [],
};
UNSAFE_componentWillUpdate() {
LayoutAnimation.easeInEaseOut();
}
_onPressAddView = () => {
this.setState(state => ({views: [...state.views, {}]}));
};
_onPressRemoveView = () => {
this.setState(state => ({views: state.views.slice(0, -1)}));
};
render() {
const views = this.state.views.map((view, i) => (
{i}
));
return (
Add view
Remove view
{views}
);
}
}
const GreenSquare = () => (
Green square
);
const BlueSquare = () => (
Blue square
);
class CrossFadeExample extends React.Component<{}, $FlowFixMeState> {
state = {
toggled: false,
};
_onPressToggle = () => {
LayoutAnimation.easeInEaseOut();
this.setState(state => ({toggled: !state.toggled}));
};
render() {
return (
Toggle
{this.state.toggled ? : }
);
}
}
class LayoutUpdateExample extends React.Component<{}, $FlowFixMeState> {
state = {
width: 200,
height: 100,
};
timeout = null;
componentWillUnmount() {
this._clearTimeout();
}
_clearTimeout = () => {
if (this.timeout !== null) {
clearTimeout(this.timeout);
this.timeout = null;
}
};
_onPressToggle = () => {
this._clearTimeout();
this.setState({width: 150});
LayoutAnimation.configureNext({
duration: 1000,
update: {
type: LayoutAnimation.Types.linear,
},
});
this.timeout = setTimeout(() => this.setState({width: 100}), 500);
};
render() {
const {width, height} = this.state;
return (
Make box square
{width}x{height}
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
button: {
borderRadius: 5,
backgroundColor: '#eeeeee',
padding: 10,
marginBottom: 10,
},
buttonText: {
fontSize: 16,
},
viewContainer: {
flex: 1,
flexDirection: 'row',
flexWrap: 'wrap',
},
view: {
height: 54,
width: 54,
backgroundColor: 'red',
margin: 8,
alignItems: 'center',
justifyContent: 'center',
},
greenSquare: {
width: 150,
height: 150,
backgroundColor: 'green',
alignItems: 'center',
justifyContent: 'center',
},
blueSquare: {
width: 150,
height: 150,
backgroundColor: 'blue',
alignItems: 'center',
justifyContent: 'center',
},
});
exports.title = 'Layout Animation';
exports.description = 'Layout animation';
exports.examples = [
{
title: 'Add and remove views',
render(): React.Element {
return ;
},
},
{
title: 'Cross fade views',
render(): React.Element {
return ;
},
},
{
title: 'Layout update during animation',
render(): React.Element {
return ;
},
},
];