[React Native] PanResponder

๊ณตํšจ์€ยท2022๋…„ 2์›” 10์ผ
1

reactNative

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

๐ŸŽˆ๋…ธ๋งˆ๋“œ์ฝ”๋”์˜ React Native ๋งˆ์Šคํ„ฐํด๋ž˜์Šค Part4 ANIMATIONS AND INTERACTIONS ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ ์žˆ๋‹ค. PanResponder ๋ผ๋Š” React Native API ๋ฅผ ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ ์ข€๋” ์ž์„ธํžˆ ์•Œ๊ณ ์‹ถ์–ด์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ คํ•œ๋‹ค!

PanResponder

  • PanResponder๋Š” ์—ฌ๋Ÿฌ ํ„ฐ์น˜๋ฅผ ๋‹จ์ผ ์ œ์Šค์ฒ˜๋กœ ์กฐ์ •ํ•œ๋‹ค.
  • ์ถ”๊ฐ€ ํ„ฐ์น˜์— ๋Œ€ํ•œ ๋‹จ์ผ ํ„ฐ์น˜ ์ œ์Šค์ฒ˜๋ฅผ ๋ณต์›ํ•˜๊ณ  ๊ธฐ๋ณธ ๋ฉ€ํ‹ฐ ํ„ฐ์น˜ ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ PanResponder๋Š” ํ™œ์„ฑ ์ œ์Šค์ฒ˜๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ์žฅ๊ธฐ ์‹คํ–‰ js ์ด๋ฒคํŠธ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” InteractionManager ์„ ๋ณด์œ ํ•œ๋‹ค.

๊ณต์‹๋ฌธ์„œ์— ์„ค๋ช…๋˜์–ด์žˆ๋Š”๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋ฒˆ์—ญํ•œ๊ฒƒ์ธ๋ฐ.. ์กฐ๊ธˆ ์–ด๋ ต ๊ทธ๋ž˜์„œ.. ๋„๋Œ€์ฒด ์ด๊ฒŒ ๋ญ๋ƒ๊ตฌใ…Žใ…Ž

I think..ํ„ฐ์น˜ ๋ฐ ์ œ์Šค์ฒ˜์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋Š” ์นœ๊ตฌ๐Ÿ™‹โ€โ™€๏ธ ์ธ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ํฌ๊ด„ํ•ด์„œ ํ„ฐ์น˜๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ฒ ๋‹ค.

PanResponder ์ƒ์„ฑ ๋ฐ ์ปดํฌ๋„ŒํŠธ์™€์˜ ๊ฒฐํ•ฉ

import React, {useRef} from "react";
import {Animated, PanResponder} from "react-native";
import styled from "styled-components/native"

const Container = styled.View`
	flex:1;
	justify-content:center;
	align-items:center;
`
const Box = styled.View`
	background-color:tomato;
	height:200px;
	width:200px;
`
const AnimatedBox = Animated.createAnimatedComponent(Box)

export default function App(){
  const POSITION = useRef(
    new Animated.ValueXY({
      x:0,
      y:0,
    }),
   ).current
const panResponder = useRef(
  PanResponder.create({
  	//ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์‚ฌ์ดํด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ์ถ”๊ฐ€
  })
).current

return (
	<Container>
    	<AnimatedBox
          {...panResponder.panHandlers}
          style={{
     		 transform:POSITION.getTranslateTransform()
     		 }}
         />
    </Container>
  )
  1. PanResponder ์ƒ์„ฑ
const panResponder = useRef(
  PanResponder.create({
 	 //ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์‚ฌ์ดํด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ์ถ”๊ฐ€
  })
).current

PanResponder๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  console.log(panResponder)์„ ๋ณด๋ฉด ์•ˆ์— panHandlers๊ฐ€ ๋“ค์–ด์žˆ๋Š”๋ฐ handlers์•ˆ์— ๋“ค์–ด์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ์ด์šฉํ•ด์„œ ํ„ฐ์น˜ ์ •๋ณด๋“ค์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค!

  1. ์ปดํฌ๋„ŒํŠธ์™€์˜ ๊ฒฐํ•ฉ
return (
	<Container>
    	<AnimatedBox
          {...panResponder.panHandlers}
          style={{
     		 transform:POSITION.getTranslateTransform()
     		 }}
         />
    </Container>
  )

ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋งํ•˜๊ณ  ์‹ถ์€ View์— handlers๋ฅผ ๊ฒฐํ•ฉ์‹œ์ผœ ์ค€๋‹ค.

ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜์žˆ๋Š” ํ•จ์ˆ˜๋“ค

panHandlers๋ฅผ ๊นŒ๋ณด๋ฉด ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์ด ๋“ค์–ด์žˆ๋‹ค.

onStartShouldSetPanResponder:(evt, gestureState)=>true,
onStartShouldSetPanResponderCapture:(evt, gestureState) => true,
onMoveShouldSetPanResponder:(evt, gestureState)=> true,
onMoveShouldSetPanResponderCapture:(evt, gestureState)=> true,

์ฃผ์–ด์ง„ ํ„ฐ์น˜ ์ด๋ฒคํŠธ์— ์‘๋‹ต ํ• ๊ฒƒ์ธ๊ฐ€ ๋ง๊ฒƒ์ธ๊ฐ€. ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ ๋ฆฌํ„ด์„ true ๋ผ๊ณ  ํ•ด์ฃผ๋ฉด ์ œ์Šค์ฒ˜ ์ด๋ฒคํŠธ ๊ฐ์ง€๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. ์œ„ ํ•จ์ˆ˜4๊ฐœ๊ฐ€ ๊ฐ™์€ ์šฉ๋„๋กœ ์“ฐ์ด๋Š”๊ฒƒ ๊ฐ™์€๋ฐ ๊ฐ๊ฐ์˜ ์ฐจ์ด์ ์€ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค..

onPanResponderGrant:(evt, gestureState) => {
}

ํ„ฐ์น˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

onPanResponderMove:(evt, gestureState) => {
}

ํ„ฐ์น˜ ์ด๋ฒคํŠธ๊ฐ€ ์ง„ํ–‰ ์ค‘์ผ ๋•Œ ํ˜ธ์ถœ ๋˜๋Š” ํ•จ์ˆ˜ (์›€์ง์ด๋Š” ๋™์•ˆ ๊ณ„~ ์† ํ˜ธ์ถœ๋จ)

onPanResponderRelease:(evt, gestureState) => {
}

ํ„ฐ์น˜ ์ด๋ฒคํŠธ๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ํ˜ธ์ถœ ๋˜๋Š” ํ•จ์ˆ˜(์†๋•Œ๋‹ˆ๊นŒ ํ˜ธ์ถœ๋จ)

์ฐธ๊ณ ๋กœ ๋‚˜๋Š” onStartShouldSetPanResponder,onPanResponderGrant,onPanResponderMove,onPanResponderRelease ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

gestureState

gestureState๋ฅผ ๊นŒ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋“ค์ด ๋“ค์–ด์žˆ๋‹ค.

  • stateID: ์ œ์Šค์ฒ˜ ์ƒํƒœ์˜ ID (ํ™”๋ฉด์— ํ•˜๋‚˜ ์ด์ƒ์˜ ํ„ฐ์น˜๊ฐ€ ์žˆ๋Š” ํ•œ ์ง€์†๋จ)
  • moveX, moveY: ์ตœ๊ทผ ์ด๋™ํ•œ ํ„ฐ์น˜์˜ ์ตœ์‹  ํ™”๋ฉด ์ขŒํ‘œ (View์˜ ์ค‘์‹ฌ์ด ์•„๋‹ˆ๋ผ ํ„ฐ์น˜ํ•œ ์ขŒํ‘œ)
  • x0, y0: ์‘๋‹ต์ž ๋ถ€์—ฌ์˜ ํ™”๋ฉด ์ขŒํ‘œ
  • dx, dy: ํ„ฐ์น˜๊ฐ€ ์‹œ์ž‘๋œ ์ดํ›„ ์ œ์Šค์ฒ˜์˜ ๋ˆ„์ ๊ฑฐ๋ฆฌ
  • vx, by: ์ œ์Šค์ฒ˜์˜ ํ˜„์žฌ ์†๋„
  • numberActiveTouches: ํ˜„์žฌ ํ™”๋ฉด์˜ ํ„ฐ์น˜ ์ˆ˜

moveX = x0 + dx
moveY = y0 + dy

์œผ์•… ์–ด๋ ต๋‹ค! ๊ณ„์† ๊ณต๋ถ€ํ•ด๋ณด์Ÿˆ!!

profile
์žผ๋‚˜๊ฒŒ ์ฝ”๋”ฉํ•˜๋ฉด์„œ ์‚ด๊ณ  ์‹ถ์–ด์š” ^O^/

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