как объяснено в следующей статье , продемонстрировано в следующем примере и предложено из Nishant Nair , вам необходимо использовать свойство transform для поворота svg
вокруг другого объекта.
Пример CSS-анимации
код включен в строку 51 файла transition-circle-keyframes.css
и использует transform
в каждом @keyframes
дляпереместите объект.
@-webkit-keyframes orbit {
from { -webkit-transform: rotate(0deg) translateX(400px) rotate(0deg); }
to { -webkit-transform: rotate(360deg) translateX(400px) rotate(-360deg); }
}
transform
transform
принимает массив объектов преобразования.Каждый объект указывает свойство, которое будет преобразовано в качестве ключа, и значение, которое будет использоваться при преобразовании.Объекты не должны быть объединены.Используйте одну пару ключ / значение для объекта.
Для преобразований поворота требуется строка, чтобы преобразование могло быть выражено в градусах (градусах) или радианах (рад).Например:
Соответствующее поле from
должно быть установлено как
transform([{ rotateX: '0deg' }, { translateX: 400}, { rotateX: '0deg' }])
Поле to должно быть установлено как
transform([{ rotateX: '360deg' }, { translateX: 400}, { rotateX: '-360deg' }])
Запуск анимации
Вы можете использовать Animated
API , чтобы изменить state
с течением времени.Для каждого keyframe
вам необходимо изменить свойство View transform
с rotateX: '0deg'
на rotateX: '360deg'
.Вы можете передать SVG как дочерний элемент компонента rotateInView
:
render() {
return (
<rotateInView>
<Svg />
</rotateInView>
);
}
компонент rotateInView
сохранит transform
как состояние, функция Animated.timing()
вызовет обновление состояния
В конструкторе rotateInView новый Animated.Value
с именем rotateAnim
инициализируется как часть состояния.Свойство transform в представлении сопоставляется с этим анимированным значением.За кулисами числовое значение извлекается и используется для установки свойства преобразования.
Когда компонент монтируется, непрозрачность устанавливается на [{ rotateX: '0deg' }, { translateX: 400}, { rotateX: '0deg' }]
.Затем запускается анимация замедления для анимированного значения rotateAnim
, которая обновляет все его зависимые отображения (в данном случае только свойство transform
) в каждом кадре, когда значение анимируется до конечного значения [{ rotateX: '360deg' }, { translateX: 400}, { rotateX: '-360deg' }]
..
Это делается оптимизированным способом, который быстрее, чем вызов setState и повторный рендеринг.Поскольку вся конфигурация декларативна, мы сможем реализовать дальнейшую оптимизацию, которая сериализует конфигурацию и запускает анимацию в высокоприоритетном потоке.
import React from 'react';
import { Animated, Text, View } from 'react-native';
class rotateInView extends React.Component {
state = {
rotateAnim: new Animated.Value(transform([{ rotateX: '0deg' }, { translateX: 400}, { rotateX: '0deg' }])),
}
componentDidMount() {
Animated.timing( // Animate over time
this.state.rotateAnim, // The animated value to drive
{
toValue: transoform([{ rotateX: '360deg' }, { translateX: 400}, { rotateX: '-360deg' }]), // change to the new value
duration: 10000, // Make it take a while
}
).start(); // Starts the animation
}
render() {
let { rotateAnim } = this.state;
return (
<Animated.View // Special animatable View
style={{
...this.props.style,
transform: rotateAnim,
}}
>
{this.props.children}
</Animated.View>
);
}
}