Анимация стилей и свойств¶
В последнем разделе мы узнали, как сделать простую анимацию, что такое общие значения и как их использовать. Теперь мы познакомимся с другим способом передачи стилей анимации компонентам. Мы также рассмотрим разницу между анимационными стилями и свойствами и то, как с ними работать с помощью useAnimatedStyle
и useAnimatedProps
.
Анимация стилей¶
Как мы узнали в предыдущем разделе, мы можем анимировать стили, передавая общие значения inline в свойство style
элементов:
1 2 3 4 5 |
|
В базовых случаях этот синтаксис работает хорошо, но у него есть один большой недостаток. Он не позволяет получить доступ к значению, хранящемуся в общем значении. Например, невозможно построить более сложную анимацию, используя встроенный стайлинг, чтобы умножить это значение (или выполнить любую другую математическую операцию) перед присвоением его свойству style
.
1 |
|
Предположим, что у нас есть пример с ящиком, который перемещается вправо при каждом нажатии кнопки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Если мы хотим настроить изменение общего значения в зависимости от вводимых пользователем данных (например, умножение на 2 или выполнение другого математического уравнения), мы не можем использовать встроенную стилизацию.
К счастью, на помощь приходит хук useAnimatedStyle
. Он предоставляет дополнительный контроль и гибкость над анимацией. Это может быть очень полезно при создании более сложных анимаций, включающих условные операторы или циклы.
Давайте посмотрим, как это работает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
useAnimatedStyle
позволяет получить доступ к значению, хранящемуся в общем значении. Благодаря этому мы можем умножить значение на 2
, прежде чем присвоить его style
. Этот хук имеет еще одно преимущество перед передачей анимации в строчные стили. Он позволяет хранить всю логику, связанную с анимацией, в одном месте.
В действии его можно увидеть в примере ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
Анимация свойств¶
Большинство значений, которые разработчики анимируют (width
, color
, transform
и т.д.), изменяются путем передачи их в качестве объекта в свойство style
элемента. Но это не всегда так.
Иногда хочется анимировать не только стили, но и свойства, передаваемые компоненту.
Например, мы хотим анимировать элементы SVG. Вместо того чтобы передавать значения в свойство style
, значения определяются как свойства:
1 |
|
Reanimated поставляется всего с несколькими встроенными компонентами, такими как Animated.View
или Animated.ScrollView
. Для компонентов, не входящих в состав Reanimated, чтобы сделать их свойства анимируемыми, необходимо обернуть их с помощью createAnimatedComponent
:
1 2 3 4 5 6 |
|
Для анимирования радиуса окружности SVG мы можем просто передать общее значение в качестве свойства:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Этот подход отлично работает, но, как и в случае с useAnimatedStyle
для анимирования стилей, мы можем инкапсулировать логику анимации и получить доступ к свойству .value
общего значения с помощью useAnimatedProps
.
Так, если мы хотим плавно увеличивать радиус круга на 10px
при каждом нажатии кнопки, мы можем использовать useAnimatedProps
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
В функции, которую useAnimatedProps
принимает в качестве аргумента, мы возвращаем объект со всеми свойствами, которые мы хотели бы анимировать. Затем мы можем передать значение, которое возвращает useAnimatedProps
, в свойство animatedProps
компонента Animated.
Ознакомьтесь с полным примером ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
Резюме¶
В этом разделе мы рассмотрели различия между анимацией стилей и свойств, а также то, как использовать useAnimatedStyle
и useAnimatedProps
. Подведем итоги:
- Передача общих значений во встроенные стили - это простой способ создания анимации, но он имеет ряд ограничений.
- Разница между анимацией
props
иstyles
заключается в том, что props передаются не в объектstyle
, а как отдельные свойства компонента. - Используя
useAnimatedStyle
иuseAnimatedProps
, можно получить доступ к значению, хранящемуся в общем значении. Это позволяет получить дополнительный контроль над анимацией. - Вы можете создавать собственные анимируемые компоненты, обернув их с помощью
Animated.createAnimatedComponent
.
Что дальше?¶
В следующем разделе мы узнаем больше о функциях анимации и о том, как настраивать их поведение.