/** * 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 * @format */ import type {RNTesterModuleExample} from '../../types/RNTesterTypes'; import * as React from 'react'; import {useEffect, useRef, useState} from 'react'; import {Animated, Easing, StyleSheet, Text, View} from 'react-native'; function AnimateTransformSingleProp() { const [theta] = useState(new Animated.Value(45)); const animate = () => { theta.setValue(0); Animated.timing(theta, { toValue: 100, duration: 3000, useNativeDriver: false, }).start(animate); }; useEffect(() => { animate(); }); return ( This text is flipping great. ); } function TransformOriginExample() { const rotateAnim = useRef(new Animated.Value(0)).current; useEffect(() => { Animated.loop( Animated.timing(rotateAnim, { toValue: 1, duration: 5000, easing: Easing.linear, useNativeDriver: true, }), ).start(); }, [rotateAnim]); const spin = rotateAnim.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '360deg'], }); return ( ); } function Flip() { const [theta] = useState(new Animated.Value(45)); const animate = () => { theta.setValue(0); Animated.timing(theta, { toValue: 360, duration: 5000, useNativeDriver: false, }).start(animate); }; useEffect(() => { animate(); }); return ( This text is flipping great. On the flip side... ); } function TranslatePercentage() { return ; } const styles = StyleSheet.create({ container: { height: 500, }, box1: { left: 0, backgroundColor: 'green', height: 50, position: 'absolute', top: 0, transform: [ {translateX: 100}, {translateY: 50}, {rotate: '30deg'}, {scaleX: 2}, {scaleY: 2}, ], width: 50, }, box2: { left: 0, backgroundColor: 'purple', height: 50, position: 'absolute', top: 0, transform: [ {scaleX: 2}, {scaleY: 2}, {translateX: 100}, {translateY: 50}, {rotate: '30deg'}, ], width: 50, }, box3step1: { left: 0, backgroundColor: 'lightpink', height: 50, position: 'absolute', top: 0, transform: [{rotate: '30deg'}], width: 50, }, box3step2: { left: 0, backgroundColor: 'hotpink', height: 50, opacity: 0.5, position: 'absolute', top: 0, transform: [{rotate: '30deg'}, {scaleX: 2}, {scaleY: 2}], width: 50, }, box3step3: { left: 0, backgroundColor: 'deeppink', height: 50, opacity: 0.5, position: 'absolute', top: 0, transform: [ {rotate: '30deg'}, {scaleX: 2}, {scaleY: 2}, {translateX: 100}, {translateY: 50}, ], width: 50, }, box4: { left: 0, backgroundColor: 'darkorange', height: 50, position: 'absolute', top: 0, transform: [{translate: [200, 350]}, {scale: 2.5}, {rotate: '-0.2rad'}], width: 100, }, box5: { backgroundColor: 'maroon', height: 50, position: 'absolute', right: 0, top: 0, width: 50, }, box5Transform: { transform: [{translate: [-50, 35]}, {rotate: '50deg'}, {scale: 2}], }, box6: { backgroundColor: 'salmon', alignSelf: 'center', }, box7: { backgroundColor: 'lightseagreen', height: 50, position: 'absolute', right: 0, top: 0, width: 50, }, box7Transform: { transform: 'translate(-50px, 35px) rotate(50deg) scale(2)', }, flipCardContainer: { marginVertical: 40, flex: 1, alignSelf: 'center', zIndex: 0, }, flipCard: { width: 200, height: 200, alignItems: 'center', justifyContent: 'center', backgroundColor: 'blue', backfaceVisibility: 'hidden', }, flipCard1: { position: 'absolute', top: 0, backgroundColor: 'red', }, flipText: { width: 90, fontSize: 20, color: 'white', fontWeight: 'bold', }, transformOriginWrapper: { alignItems: 'center', }, transformOriginView: { backgroundColor: 'pink', width: 100, height: 100, transformOrigin: 'top left', }, translatePercentageView: { transform: 'translate(50%)', padding: 50, alignSelf: 'flex-start', backgroundColor: 'lightblue', }, }); exports.title = 'Transforms'; exports.category = 'UI'; exports.documentationURL = 'https://reactnative.dev/docs/transforms'; exports.description = 'View transforms'; exports.examples = [ { title: 'Perspective, Rotate, Animation', description: 'perspective: 850, rotateX: Animated.timing(0 -> 360)', render(): React.Node { return ; }, }, { title: 'Translate, Rotate, Scale', description: "translateX: 100, translateY: 50, rotate: '30deg', scaleX: 2, scaleY: 2", render(): React.Node { return ( ); }, }, { title: 'Scale, Translate, Rotate, ', description: "scaleX: 2, scaleY: 2, translateX: 100, translateY: 50, rotate: '30deg'", render(): React.Node { return ( ); }, }, { title: 'Rotate', description: "rotate: '30deg'", render(): React.Node { return ( ); }, }, { title: 'Rotate, Scale', description: "rotate: '30deg', scaleX: 2, scaleY: 2", render(): React.Node { return ( ); }, }, { title: 'Rotate, Scale, Translate ', description: "rotate: '30deg', scaleX: 2, scaleY: 2, translateX: 100, translateY: 50", render(): React.Node { return ( ); }, }, { title: 'Translate, Scale, Rotate', description: "translate: [200, 350], scale: 2.5, rotate: '-0.2rad'", render(): React.Node { return ( ); }, }, { title: 'Translate, Rotate, Scale', description: "translate: [-50, 35], rotate: '50deg', scale: 2", render(): React.Node { return ( ); }, }, { title: 'Animate Translate single prop', description: "rotate: '360deg'", render(): React.Node { return ; }, }, { title: 'Transform using a string', description: "transform: 'translate(-50px, 35px) rotate(50deg) scale(2)'", render(): React.Node { return ( ); }, }, { title: 'Transform origin', description: "transformOrigin: 'top left'", render(): React.Node { return ; }, }, { title: 'Translate Percentage', description: "transform: 'translate(50%)'", render(): React.Node { return ; }, }, ] as Array;