info.plist 파일 업데이트(아이콘 관련)
build.gradle 파일 업데이트(아이콘 관련)
FloatButton 만들기
앞에서 배운 Touchable* 컴포넌트 대신 리액트 네이티브 v0.63에서 새로 도입된 Pressable 컴포넌트를 사용했다.
import React from'react';import {Platform, Pressable, StyleSheet, View} from'react-native';import Icon from'react-native-vector-icons/MaterialIcons';functionFloatingWriteButton() {return ( <Viewstyle={styles.wrapper}> <Pressablestyle={({pressed}) => [styles.button,Platform.select({ios: {opacity: pressed ?0.6:1}}), ]}android_ripple={{color:'white'}}> <Iconname="add"size={24} style={styles.icon} /> </Pressable> </View> );}conststyles=StyleSheet.create({ wrapper: { position:'absolute', bottom:16, right:16, width:56, height:56, borderRadius:28,// IOS 전용 그림자 설정 shadowColor:'#4d4d4d', shadowOffset: {width:0, height:4}, shadowOpacity:0.3, shadowRadius:4,// 안드로이드 전용 그림자 설정 elevation:5,// 안드로이드에서 물결 효과가 영역 밖으로 나가지 않도록 설정// ios에서는 overflow가 hidden이 경우 그림자가 보여지지 않음 overflow:Platform.select({android:'hidden'}), }, button: { width:56, height:56, borderRadius:28, backgroundColor:'#009688', justifyContent:'center', alignItems:'center', }, icon: { color:'white', },});exportdefault FloatingWriteButton;
Pressable 컴포넌트는 TouchableWithoutFeedback과 성격이 비슷하지만 기능이 더 많다. android_ripple을 설정하여 안드로이드에서 물결 효과를 줄 수 있으며, 스타일을 설정할 때 pressed 값을 인식하여 컴포넌트가 눌리면 동적인 스타일을 적용할 수도 있다.
import React, {useRef} from'react';import {Animated, Easing} from'react-native';/** * 초기에 설정한 값(new Animated.Value(...)을 변경할때는 Animated.timeing() 함수를 이용한다. * * example) * const animation = useRef(new Animated.Value(1)).current; * Animated.timeing(animation, { useNativeDriver: true, // 필수값 (네이티브 드라이버 사용 여부) toValue: 0, // 필수값 (변경할 값) // option duration: 1000, // 기본값 500, 애니메이션에 걸리는 시간 delay: 0, // 기본값 0, 딜레이 이후 애니메이션 시작 isInteraction: true, // 기본값 true, 사용자 인터랙션에 의해 시작한 애니메이션인지 지정 easing: Easing.inOut(Easing.ease), // 기본값: Easing.inOut(Easing.ease), 애니메이션 속도 변경 함수 * }).start(optionalFunc) * * optionalFunc => 애니메이션 처리 완료 후 실행할 작업 */functionSampleAnimated() {// Value 생성자 함수 인자에는 초깃값을 넣는다.constanimation=useRef(newAnimated.Value(1)).current;return <Animated.Viewstyle={{opacity: animation}} />;}
useNativeDriver: 애니메이션 작업을 자바스크립트 엔진이 아닌 네이티브 레벨에서 진행하는 옵션으로 transform, opacity처럼 레이아웃과 관련 없는 스타일에만 적용할 수 있다. 예를들어 left, width, paddingLeft, marginLeft와 같은 스타일에는 꼭 useNativeDriver: false로 지정해 줘야 한다.
만약 어떤 상태값에 따라 애니메이션이 변하게 하고 싶다면 useState, useEffect를 이용하자.