Анимации — это волшебство, которое оживляет мобильные приложения. В мире, где пользовательское взаимодействие имеет значение, анимации играют решающую роль. Они помогают пользователям ориентироваться в приложении, делают интерфейс плавным и добавляют профессиональный штрих.

Сегодня мы разберём:

  • Как работают анимации в React Native.
  • Использование Reanimated для создания сложных анимаций.
  • Анимация через Lottie.
  • Практическую реализацию анимации нажатия кнопки и анимированной заставки при запуске.

Теория: анимации в React Native

React Native предоставляет встроенный модуль Animated, который подходит для базовых задач. Но если вам нужны сложные и производительные анимации, лучше использовать:

  • Reanimated: для сложных интерактивных анимаций с нативным рендерингом.
  • Lottie: для воспроизведения готовых JSON-анимаций, созданных в After Effects.

Встроенный модуль Animated

С помощью Animated можно:

  • Анимировать изменение стилей компонентов (например, прозрачность, позицию).
  • Создавать таймлайны анимаций.

Пример:

import React, { useRef, useEffect } from 'react';
import { Animated, View, StyleSheet } from 'react-native';

const SimpleAnimation = () => {
  const fadeAnim = useRef(new Animated.Value(0)).current; // Начальное значение анимации

  useEffect(() => {
    Animated.timing(fadeAnim, {
      toValue: 1, // Конечное значение прозрачности
      duration: 1000, // Длительность в миллисекундах
      useNativeDriver: true, // Используем нативный драйвер
    }).start();
  }, [fadeAnim]);

  return (
    <Animated.View style={[styles.box, { opacity: fadeAnim }]} />
  );
};

const styles = StyleSheet.create({
  box: {
    width: 100,
    height: 100,
    backgroundColor: 'blue',
  },
});

export default SimpleAnimation;

Reanimated: мощь и гибкость

Reanimated — это библиотека, которая обеспечивает более высокую производительность за счёт работы на нативной стороне. Она отлично подходит для сложных анимаций, таких как жесты, переходы и интерактивные элементы.

Установка Reanimated:

npm install react-native-reanimated

Не забудьте добавить плагин в babel.config.js:

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: ['react-native-reanimated/plugin'],
};

Lottie: готовые анимации

Lottie позволяет использовать JSON-анимации, созданные дизайнерами в After Effects с плагином Bodymovin. Это идеальный инструмент для воспроизведения сложных анимаций без необходимости писать код.

Установка Lottie:

npm install lottie-react-native

⚠️ Для Expo:

expo install lottie-react-native

Практика 1: Анимация нажатия кнопки

Давайте создадим анимацию кнопки, которая изменяет свой размер при нажатии.

Код кнопки с анимацией:

import React, { useRef } from 'react';
import { Animated, TouchableWithoutFeedback, StyleSheet, Text, View } from 'react-native';

const AnimatedButton = () => {
  const scaleAnim = useRef(new Animated.Value(1)).current; // Начальное значение масштаба

  const handlePressIn = () => {
    Animated.spring(scaleAnim, {
      toValue: 0.8, // Уменьшаем размер
      useNativeDriver: true,
    }).start();
  };

  const handlePressOut = () => {
    Animated.spring(scaleAnim, {
      toValue: 1, // Возвращаем к исходному размеру
      useNativeDriver: true,
    }).start();
  };

  return (
    <View style={styles.container}>
      <TouchableWithoutFeedback
        onPressIn={handlePressIn}
        onPressOut={handlePressOut}
      >
        <Animated.View style={[styles.button, { transform: [{ scale: scaleAnim }] }]}>
          <Text style={styles.buttonText}>Нажми меня</Text>
        </Animated.View>
      </TouchableWithoutFeedback>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  button: {
    backgroundColor: '#6200ea',
    paddingVertical: 15,
    paddingHorizontal: 30,
    borderRadius: 25,
  },
  buttonText: {
    color: '#fff',
    fontSize: 18,
  },
});

export default AnimatedButton;

Что происходит:

  • При нажатии кнопка уменьшается в масштабе до 80%.
  • Когда отпускаем, кнопка возвращается в исходное состояние.

Практика 2: Анимированная заставка при запуске приложения

Теперь добавим заставку при запуске приложения с использованием Lottie.

Код заставки:

import React, { useState, useEffect } from 'react';
import { View, StyleSheet, Text } from 'react-native';
import LottieView from 'lottie-react-native';

const SplashScreen = ({ onFinish }) => {
  useEffect(() => {
    const timer = setTimeout(() => {
      onFinish(); // Вызываем коллбек, чтобы завершить заставку
    }, 3000);

    return () => clearTimeout(timer); // Очищаем таймер
  }, [onFinish]);

  return (
    <View style={styles.splashContainer}>
      <LottieView
        source={require('./assets/splash.json')} // Замените на ваш JSON-файл
        autoPlay
        loop
      />
    </View>
  );
};

const App = () => {
  const [isLoading, setIsLoading] = useState(true);

  if (isLoading) {
    return <SplashScreen onFinish={() => setIsLoading(false)} />;
  }

  return (
    <View style={styles.appContainer}>
      <Text style={styles.text}>Добро пожаловать в приложение!</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  splashContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#000',
  },
  appContainer: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#fff',
  },
  text: {
    fontSize: 24,
    color: '#333',
  },
});

export default App;

Как это работает:

  • Пока isLoading равно true, отображается заставка.
  • Через 3 секунды isLoading меняется на false, и отображается основной экран.
  • JSON-анимация воспроизводится с помощью LottieView.

Советы по работе с анимациями

  • Не злоупотребляйте анимациями: они должны быть полезными, а не раздражающими.
  • Используйте нативные драйверы: это повышает производительность.
  • Экспериментируйте с Reanimated: он открывает множество возможностей для кастомизации.
 

Комментарии

0

Без регистрации и смс