[RN] ๐ŸชธAnimated๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉํ•˜๊ธฐ

TATAยท2023๋…„ 8์›” 5์ผ
0

React-Native

๋ชฉ๋ก ๋ณด๊ธฐ
4/7

โ–ท Animated

Animated๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ, ์œ„์น˜, ํˆฌ๋ช…๋„ ๋“ฑ์˜ ์†์„ฑ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„, ํƒ€์ด๋ฐ, ๋ฐ˜๋ณต ๋“ฑ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿชธ Animated value ์ƒ์„ฑ

// ๊ฐ’์„ ์ง์ ‘ ๋ฐ”๊พธ๋ฉด ์•ˆ๋˜๊ธฐ์— useRef๋ฅผ ์‚ฌ์šฉํ•จ
// Value์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์ธ์ž์—๋Š” ์ดˆ๊นƒ๊ฐ’์„ ๋„ฃ์–ด์คŒ
const refAnimation = useRef(new Animated.Value(0)).current;

๐Ÿชธ interpolate, Animated.View

interpolate: Value๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ƒ์„ฑ

const widthAnimation = refAnimation.interpolate({
  inputRange: [0, 10], // refAnimation์˜ ๊ฐ’์ด 0์—์„œ 10 ์‚ฌ์ด๋กœ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
  outputRange: ['0%', '100%'], // refAnimation์ด 0์ผ ๋•Œ๋Š” '0%'๊ฐ€ ์ƒ์„ฑ, ๊ฐ’์ด 10์ผ ๋•Œ๋Š” '100%'๊ฐ€ ์ƒ์„ฑ
});

...
// Animated ์—ฐ๊ฒฐ
<Animated.View style={{ width: widthAnimation }} />

๐Ÿชธ Animated.timing

Animated.timing์„ ์ด์šฉํ•ด์„œ Animated Value์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Animated.timing(refAnimation, {
  toValue: 0, // ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ชฉํ‘œ, refAnimation์ด ์ด ๊ฐ’์œผ๋กœ ๋ณ€ํ™” (ํ•„์ˆ˜โญ๏ธ)
  useNativeDriver: true, // ๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋ผ์ด๋ฒ„ ์‚ฌ์šฉ ์—ฌ๋ถ€ (ํ•„์ˆ˜โญ๏ธ) - false์ผ ๊ฒฝ์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ถ€๋“œ๋Ÿฝ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.
  duration: 1000, // ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ง€์† ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ • - ๊ธฐ๋ณธ๊ฐ’ 500
  delay: 0, // ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์‹œ์ž‘์„ ์ง€์—ฐ์‹œํ‚ฌ ์‹œ๊ฐ„
  isInteraction: true, // ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋‹ค๋ฅธ ์ƒํ˜ธ์ž‘์šฉ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€ - ๊ธฐ๋ณธ๊ฐ’ true
  easing: Easing.inOut(Easing.ease), // ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ฐ€์†๋„ ํ•จ์ˆ˜๋ฅผ ์„ค์ •, Easing ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•จ - ๊ธฐ๋ณธ๊ฐ’ Easing.inOut(Easing.ease)
}).start(() => {
  // ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ž‘์—…
})

๐Ÿชธ Animated๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ

7์ดˆ๋™์•ˆ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์›€์ง์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜

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

...
const refAnimation = useRef(new Animated.Value(-380)).current;

useEffect(() => {
  Animated.timing(refAnimation, {
    toValue: 0,
    delay: 0,
    duration: 7000,
    useNativeDriver: true,
  }).start(() => {
    navigation.goBack(); // ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚˜๋ฉด ๋’ค๋กœ๊ฐ€๊ธฐ ๋จ
  });
}, [refAnimation, navigation]);

const animatedStyle = {
  height: '100%',
  backgroundColor: 'skyblue',
  transform: [{translateX: refAnimation}],
};

...
<Animated.View style={animatedStyle} />



๐Ÿ‘‰ (๊ณต์‹๋ฌธ์„œ)React-Native Animated

profile
๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€