React Native Reanimated와 React Native Gesture Handler는 모두 React Native에서 애니메이션과 제스처 처리를 개선하기 위해 사용되는 라이브러리입니다. 이 두 모듈은 모두 Software Mansion이라는 회사에서 관리하고 있습니다. 그러나 이 두 라이브러리는 서로 다른 목적과 기능을 가지고 있습니다.
React Native Reanimated : 주로 애니메이션을 처리하는 데 사용
React Native Reanimated는 React Native 애니메이션 라이브러리로, 성능이 뛰어나고 복잡한 애니메이션을 구현할 수 있도록 설계되었습니다. Reanimated는 애니메이션 로직을 JavaScript 스레드가 아닌 UI 스레드에서 실행할 수 있도록 하여, 애니메이션의 성능을 크게 향상시킵니다.
주요 특징
- Declarative API: Reanimated는 선언형 API를 사용하여 애니메이션을 정의할 수 있습니다. 이는 React의 철학과 잘 맞습니다.
- Worklets: Worklets는 애니메이션 로직을 UI 스레드에서 실행할 수 있게 하는 작은 JavaScript 함수입니다.
- 종속성: 애니메이션을 구성 요소의 종속성으로 처리하여, 상태와 애니메이션 로직을 깔끔하게 분리할 수 있습니다.
- 강력한 구성: Reanimated는 복잡한 애니메이션을 쉽게 구성할 수 있는 유연한 API를 제공합니다.
- 기본적인 성능: 애니메이션 로직이 UI 스레드에서 실행되기 때문에, JavaScript 스레드의 부하가 높은 경우에도 애니메이션이 부드럽게 실행됩니다.
import React from 'react';
import { View, Text } from 'react-native';
import Animated, { Easing, useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated';
const App = () => {
const offset = useSharedValue(0);
const animatedStyles = useAnimatedStyle(() => {
return {
transform: [{ translateY: offset.value }],
};
});
React.useEffect(() => {
offset.value = withTiming(100, {
duration: 1000,
easing: Easing.inOut(Easing.ease),
});
}, []);
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Animated.View style={[{ width: 100, height: 100, backgroundColor: 'blue' }, animatedStyles]} />
</View>
);
};
export default App;
React Native Gesture Handler : 주로 제스처를 처리하는 데 사용
React Native Gesture Handler는 React Native에서 터치 및 제스처 처리를 개선하기 위해 사용되는 라이브러리입니다. 기본 제공 제스처 시스템의 한계를 극복하고, 복잡한 제스처를 효율적으로 처리할 수 있도록 설계되었습니다.
주요 특징
- 성능 최적화: 기본 제공 제스처 시스템보다 더 높은 성능을 제공합니다.
- 간편한 제스처 관리: 다양한 제스처(탭, 팬, 핀치, 회전 등)를 쉽게 관리할 수 있는 API를 제공합니다.
- 제스처 구성 요소: 각종 제스처를 감지할 수 있는 구성 요소를 제공합니다.
- 네이티브 통합: 네이티브 수준에서 제스처를 처리하여 더욱 부드럽고 빠른 응답성을 제공합니다.
- 호환성: 다른 애니메이션 라이브러리와 쉽게 통합할 수 있습니다.
import React from 'react';
import { View, Text } from 'react-native';
import { GestureHandlerRootView, PanGestureHandler } from 'react-native-gesture-handler';
import Animated, { useAnimatedGestureHandler, useAnimatedStyle, useSharedValue } from 'react-native-reanimated';
const App = () => {
const translateX = useSharedValue(0);
const translateY = useSharedValue(0);
const animatedStyles = useAnimatedStyle(() => {
return {
transform: [{ translateX: translateX.value }, { translateY: translateY.value }],
};
});
const panGestureEvent = useAnimatedGestureHandler({
onStart: (event, context) => {
context.startX = translateX.value;
context.startY = translateY.value;
},
onActive: (event, context) => {
translateX.value = context.startX + event.translationX;
translateY.value = context.startY + event.translationY;
},
onEnd: () => {
// handle gesture end
},
});
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<PanGestureHandler onGestureEvent={panGestureEvent}>
<Animated.View style={[{ width: 100, height: 100, backgroundColor: 'red' }, animatedStyles]} />
</PanGestureHandler>
</GestureHandlerRootView>
);
};
export default App;
'개발관련' 카테고리의 다른 글
<Image /> react-native (0) | 2024.05.24 |
---|---|
Pinch gesture (0) | 2024.05.24 |
ChatGPT 과 코드 (0) | 2024.05.24 |
Expo SDK 51 - iPhone (0) | 2024.05.20 |
Google Fonts - expo (0) | 2024.05.06 |