Анимация React-native-svg

Я пытаюсь анимировать SVG с помощью этого кода:

//create animated path component

const AnimatedPath = Animated.createAnimatedComponent(Path);

  P1 = new Animated.ValueXY({x: 0, y: 1});
  P2 = new Animated.ValueXY({x: 1, y: 1});
  P3 = new Animated.ValueXY({x: 2, y: 1});
  path = `M ${this.P1._value} ${this.P1._value} S ${this.P2.x._value} ${this.P2.y._value} ${this.P3.x._value} ${this.P3.y._value}`;

            Animated.timing(this.P1, {
              toValue: {x: 3, y: 3},
              duration: 300,
              useNativeDriver: 'true',
            }).start();


        <Svg height="50%" width="50%" viewBox="0 0 4 4 " fill="blue">
          {/* <Path /> */}
          {console.log('this.P1.x: ', this.P1.x)}
          <AnimatedPath
            d={this.path}
            // d="M 0 1 S 1 1 2 1"
            fill="none"
            stroke="red"
          />
        </Svg>

но он не работает. Есть ли способ сделать его анимацией?
также должны ли мы использовать react-native-reanimated2?


person Phaoga55    schedule 17.09.2020    source источник


Ответы (1)


Ознакомьтесь с документацией по reanimated2 для useAnimatedProps. Обратите внимание, что в задокументированном примере есть некоторые недостатки, вот демо:

import { StyleSheet } from 'react-native';
import {
  Animated,
  useSharedValue,
  useAnimatedProps,
  withTiming
} from 'react-native-reanimated';
import Svg, { Path } from 'react-native-svg';

const AnimatedPath = Animated.createAnimatedComponent(Path);

function App() {
  const radius = useSharedValue(50);

  const animatedProps = useAnimatedProps(() => {
    // draw a circle
    const path = `
    M 100, 100
    m -${radius}, 0
    a ${radius},${radius} 0 1,0 ${radius * 2},0
    a ${radius},${radius} 0 1,0 ${-radius * 2},0
    `;
    return {
      d: path
    };
  });

  // attach animated props to an SVG path using animatedProps
  return <Svg><AnimatedPath animatedProps={animatedProps} fill="black" onPress={() => radius.value = withTiming(Math.random() * 180)} /></Svg>
}

Я знаю, что вы, вероятно, нашли решение, но я хотел дать ответ людям, которые наткнулись на это.

person Muhammed B. Aydemir    schedule 16.10.2020
comment
Я нигде не могу найти решение, но я попробую ваше. Спасибо - person Phaoga55; 16.10.2020