Привет, это Альваро, и сегодня мы начинаем новую серию статей о React Native!

Что мы будем делать здесь?

  • Красивые анимации с React Native
  • Исследуйте все возможности ручной анимации (без дополнительных библиотек), Animated API.
  • Стилизованные компоненты!
  • Redux (возможно, это добавляет сложности, но мы можем управлять анимацией, где захотим!)

Что нам нужно?

  • Рабочее пространство
  • Выставка (узел, IDE и т. д.)
  • Хайп, чтобы учиться

Хотите начать? Пойдем!

Сегодняшняя анимация…

Мы скроем/покажем боковое меню и изменим стиль строки состояния.

Давайте начнем:

(все команды пряжи могут быть выполнены с помощью npm)

expo init AnimatedMenu
cd AnimatedMenu
yarn add styled-components redux react-redux

Когда все будет готово, создайте 2 компонента: «Dashboard.js» для основных компонентов и «Menu.js» для меню. И папка для сохранения всех избыточных вещей (мне нравится иметь что-то вроде избыточности/редукторов, избыточности/действий и избыточности/индекса), но для этого простого проекта 3 файла будут внутри папки избыточности.

Каждый файл или папка, которые я создам с этого момента, будут внутри /src/ в нашем корневом каталоге! (Кроме основного App.js)

Чтобы ускорить работу, вот конфигурация для редукции:

Итак, теперь мы можем сосредоточиться на наших компонентах и ​​анимации:

Это наш компонент приборной панели без анимации и не связанный с избыточностью:

Просто, но уже бесполезно.

Теперь создадим наше меню:

И давайте поместим их в наш App.js:

Прямо сейчас вы должны увидеть только компонент Dashboard, и ничего не произойдет, если мы нажмем кнопку.

Давайте сотворим волшебство:

Будем использовать пружины (на мой взгляд лучше тайминги, но иногда потребности разные и нужно использовать тайминги)





Функция .spring() будет управлять всем, нам просто нужно передать значение для достижения. В примере:

У нас есть поле шириной 200px:

const animatedWidth = new Animated.Value(200);
...
<AnimatedBox style={{ width: animatedWidth }} />

Если мы настроим функцию, которая изменяет эту ширину:

const changeWidth = () => {
  Animated.spring(animatedWidth, { toValue: 400 }).start();
}

Когда мы запустим эту функцию, ширина увеличится с 200 до 400 и будет иметь красивую пружинящую анимацию.

Теперь, в нашей панели инструментов, что мы хотим сделать? Хм... мы хотим изменить размер (масштаб) компонента и переместить его вправо.

Что мы можем сделать? Измени масштаб и переведиX!

В нашем Dashboard.js импортируйте Animated API из react-native и создайте конструктор:

constructor(props) {
  super(props);
  this.scale = new Animated.Value(1);
  this.translateX = new Animated.Value(0);
}

Компонент всегда будет начинаться с нормального масштаба и будет находиться в правильном положении.

Теперь мы не можем анимировать обычные компоненты, нам нужно создать анимированный компонент. Под нашим компонентом Container создайте AnimatedContainer:

const AnimatedContainer = Animated.createAnimatedComponent(Container);

И поместите все это вместе на рендер:

return (
  <AnimatedContainer
    style={{
      transform: [{ translateX: this.translateX }, { scale: this.scale }]
    }}
  >
    <TouchableOpacity>
      <Title>Toggle Menu</Title>
    </TouchableOpacity>
  </AnimatedContainer>
);

Теперь наш компонент Dashboard является анимированным компонентом, давайте попробуем анимацию!

Нам надо:

  • Настройте ComponentDidUpdate, чтобы проверить, переключается ли меню или нет.
  • Создайте функцию для запуска анимации
  • Создадим обработчик для кнопки

Можно ли это сделать, не глядя в код? Это очень легко!

Это наш полный компонент:

И давайте сделаем то же самое с меню!

Как только мы это сделаем, наше приложение должно быть анимировано следующим образом:

Вот полный код для этого примера и № 1 в этой серии!



Не забывайте, что вы можете позвонить мне, если вам что-то понадобится!