Как повторить анимацию в react-spring?

Ссылка скопирована
1 ответ

Я застрял на моменте смещения с поворотом, почему-то не работает transformOrigin, как мне кажется:

import {Button, Text, View} from 'react-native'; import {useSpring, animated, easings, useSpringValue} from '@react-spring/native'; import {Svg, Circle} from 'react-native-svg';  const AnimatedCircle = animated(Circle); const AnimatedText = animated(Text); export default function App() {     const [rotate, rotateApi] = useSpring(() => ({         rotate: "0deg",         transformOrigin: '50% 50%',         config: {             duration: 1000,             easing: easings.linear,         },     }), []);      const [line2, apiLine2] = useSpring(() => ({         x: 75,         y: 75,         transformOrigin: '50% 50%',         loop: true,         config: {             duration: 1000,             easing: easings.linear         }     }), []);      const handleClick = () => {         rotateApi.start({             from: {                 rotate: "0deg",                 transformOrigin: '50% 50%',             },             to: {                 rotate: "360deg",                 transformOrigin: '50% 50%',             },             // loop: true,         });         apiLine2.start({             from: {                 x: 75,                 y: 75,                 transformOrigin: '50% 50%',             },             to: {                 x: 105,                 y: 75,                 transformOrigin: '50% 50%',             },         });     }      return (         <View>             <Svg style={[{                 width: '150px',                 height: '150px',             }]} viewBox={'0 0 150 150'}>                 <AnimatedCircle x="75" y="75" r="30" fill='none' stroke='rgb(185, 64, 188)' strokeWidth="20" strokeDasharray='40.4, 19.4, 48.6, 20, 40, 20'                                 style={{                                     transform: [{rotate: rotate.rotate}],                 }}/>                 <AnimatedCircle x={105} y={105} r="30" fill='none' stroke='rgb(121, 36, 122)' strokeWidth="20" strokeDasharray='0, 168.4, 20, 0'                                 style={{                                     transform: [{rotate: rotate.rotate}],                                     transformOrigin: '50% 50%',                                 }}/>             </Svg>              <Button title={'Animate'} onPress={handleClick} />          </View>     ); }

import {Button, Text, View} from 'react-native'; import {useSpring, animated, easings, useSpringValue} from '@react-spring/native'; import {Svg, Circle} from 'react-native-svg'; const AnimatedCircle = animated(Circle); const AnimatedText = animated(Text); export default function App() { const [rotate, rotateApi] = useSpring(() => ({ rotate: "0deg", transformOrigin: '50% 50%', config: { duration: 1000, easing: easings.linear, }, }), []); const [line2, apiLine2] = useSpring(() => ({ x: 75, y: 75, transformOrigin: '50% 50%', loop: true, config: { duration: 1000, easing: easings.linear } }), []); const handleClick = () => { rotateApi.start({ from: { rotate: "0deg", transformOrigin: '50% 50%', }, to: { rotate: "360deg", transformOrigin: '50% 50%', }, // loop: true, }); apiLine2.start({ from: { x: 75, y: 75, transformOrigin: '50% 50%', }, to: { x: 105, y: 75, transformOrigin: '50% 50%', }, }); } return ( <View> <Svg style={[{ width: '150px', height: '150px', }]} viewBox={'0 0 150 150'}> <AnimatedCircle x="75" y="75" r="30" fill='none' stroke='rgb(185, 64, 188)' strokeWidth="20" strokeDasharray='40.4, 19.4, 48.6, 20, 40, 20' style={{ transform: [{rotate: rotate.rotate}], }}/> <AnimatedCircle x={105} y={105} r="30" fill='none' stroke='rgb(121, 36, 122)' strokeWidth="20" strokeDasharray='0, 168.4, 20, 0' style={{ transform: [{rotate: rotate.rotate}], transformOrigin: '50% 50%', }}/> </Svg> <Button title={'Animate'} onPress={handleClick} /> </View> ); }

Я попытался загрузить на expo go snack - не получилось, не знаю как это запустить, изучаю пару дней как.

Оригинальная анимация с scss:
snippet

.loader .line-2 { 	cx: $size; 	cy: $size; 	r: $radius; 	fill: none; 	stroke: rgb(121, 36, 122); 	stroke-width: $stroke-size; 	stroke-dasharray: 0, 168.4, 20, 0; 	animation: resizeRightSide $pieces-duration linear infinite, rotate $pieces-rotation-duration linear infinite $pieces-rotation-delay; 	transform-origin: 50% 50%; }

.loader .line-2 { cx: $size; cy: $size; r: $radius; fill: none; stroke: rgb(121, 36, 122); stroke-width: $stroke-size; stroke-dasharray: 0, 168.4, 20, 0; animation: resizeRightSide $pieces-duration linear infinite, rotate $pieces-rotation-duration linear infinite $pieces-rotation-delay; transform-origin: 50% 50%; }

Если закомментировать трансформацию получается примерно тот-же эффект что я получаю в react-native, я понимаю что я его получаю потому-что смещаю элемент по x, y и мне нужен эффект как на фидле, он смещается и вращается по большему радиусу, возможно здесь нужен другой подход.

Как повторить анимацию в react-spring?

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Алексей Денисов Ответ

Для повторения анимации в react-spring вы можете использовать хук useTransition. Этот хук позволяет вам определить набор элементов, которые вы хотите анимировать, и определить, как они должны анимироваться.

Прежде всего, убедитесь, что у вас установлен react-spring. Вы можете установить его с помощью npm или yarn:

npm install react-spring
или
yarn add react-spring

Затем вы можете использовать хук useTransition в вашем компоненте. Вот пример:

import { useTransition, animated } from 'react-spring';
 
const items = [{ key: 1, text: 'Item 1' }, { key: 2, text: 'Item 2' }];
 
const AnimatedList = () => {
  const transitions = useTransition(items, item => item.key, {
    from: { opacity: 0 },
    enter: { opacity: 1 },
    leave: { opacity: 0 },
  });
 
  return (
    <div>
      {transitions.map(({ item, key, props }) =&gt; (
 
          {item.text}
 
      ))}
    </div>
  );
};
 
export default AnimatedList;

import { useTransition, animated } from 'react-spring'; const items = [{ key: 1, text: 'Item 1' }, { key: 2, text: 'Item 2' }]; const AnimatedList = () =&gt; { const transitions = useTransition(items, item =&gt; item.key, { from: { opacity: 0 }, enter: { opacity: 1 }, leave: { opacity: 0 }, }); return ( <div> {transitions.map(({ item, key, props }) =&gt; ( {item.text} ))} </div> ); }; export default AnimatedList;

В этом примере у нас есть массив items, который мы хотим анимировать. Мы используем хук useTransition, чтобы определить, как элементы должны появляться и исчезать. Затем мы отображаем каждый элемент с помощью компонента animated.div, который автоматически применяет анимацию.

Вы можете настраивать анимацию, изменяя значения from, enter и leave в объекте конфигурации useTransition. Таким образом, вы можете легко создавать различные виды анимаций для ваших элементов в react-spring.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно