/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow strict-local * @format */ import type {RNTesterModuleExample} from '../../types/RNTesterTypes'; import RNTConfigurationBlock from '../../components/RNTConfigurationBlock'; import RNTesterButton from '../../components/RNTesterButton'; import {RNTesterThemeContext} from '../../components/RNTesterTheme'; import ToggleNativeDriver from './utils/ToggleNativeDriver'; import * as React from 'react'; import {useContext, useRef, useState} from 'react'; import { Animated, Easing, SectionList, StyleSheet, Text, View, } from 'react-native'; type Props = $ReadOnly<{}>; type EasingListItem = { title: string, easing: (value: number) => number, }; const easingSections = [ { title: 'Predefined animations', data: [ {title: 'Bounce', easing: Easing.bounce}, {title: 'Ease', easing: Easing.ease}, {title: 'Elastic', easing: Easing.elastic(4)}, ], }, { title: 'Standard functions', data: [ {title: 'Linear', easing: Easing.linear}, {title: 'Quad', easing: Easing.quad}, {title: 'Cubic', easing: Easing.cubic}, ], }, { title: 'Additional functions', data: [ { title: 'Bezier', easing: Easing.bezier(0, 2, 1, -1), }, {title: 'Circle', easing: Easing.circle}, {title: 'Sin', easing: Easing.sin}, {title: 'Exp', easing: Easing.exp}, ], }, { title: 'Combinations', data: [ { title: 'In + Bounce', easing: Easing.in(Easing.bounce), }, { title: 'Out + Exp', easing: Easing.out(Easing.exp), }, { title: 'InOut + Elastic', easing: Easing.inOut(Easing.elastic(1)), }, ], }, ]; function EasingItem({ item, useNativeDriver, }: { item: EasingListItem, useNativeDriver: boolean, }): React.Node { const opacityAndScale = useRef(new Animated.Value(1)); const animation = useRef( Animated.timing(opacityAndScale.current, { toValue: 1, duration: 1200, easing: item.easing, useNativeDriver, }), ); const animatedStyles = [ styles.box, { opacity: opacityAndScale.current, transform: [{scale: opacityAndScale.current}], }, ]; const theme = useContext(RNTesterThemeContext); return ( {item.title} { opacityAndScale.current.setValue(0); animation.current.start(); }}> Animate ); } function EasingExample(props: Props): React.Node { const [useNativeDriver, setUseNativeDriver] = useState(false); return ( <> { const item: EasingListItem = info.item; return ( ); }} renderSectionHeader={({section: {title}}) => ( {title} )} /> ); } const boxSize = 50; const styles = StyleSheet.create({ sectionHeader: { paddingHorizontal: 8, paddingVertical: 4, backgroundColor: '#f4f4f4', color: '#999', fontSize: 12, }, itemContainer: { padding: 8, flexDirection: 'row', alignItems: 'center', }, itemMeta: { flex: 1, alignItems: 'flex-start', }, itemTitle: { fontSize: 18, fontWeight: '300', }, boxContainer: { alignItems: 'center', justifyContent: 'center', height: boxSize, width: boxSize * 2, }, box: { borderRadius: 4, backgroundColor: '#61dafb', width: boxSize, height: boxSize, }, }); export default ({ title: 'Easing', name: 'easing', description: 'The Easing module implements common easing functions. This module is used by Animated.timing() to convey physically believable motion in animations.', render: () => , }: RNTesterModuleExample);