React native - Animated view default position

47 Views Asked by At

im trying to understand why does setting toValue x and y to 0 return the view to its initial position using Animated.spring, but when i save the view x and y coords using onLayout it add those coordinates as margin. here is my exemple:

import React, {useRef} from 'react';
import {View, Text, PanResponder, Animated} from 'react-native';
const Cards: React.FC<{}> = (): JSX.Element => {
    const translate = useRef(new Animated.ValueXY()).current;
    const cords = useRef<{viewX: number; viewY: number}>({
        viewX: 0,
        viewY: 0,
    }).current;
    const panResponder = useRef(
        PanResponder.create({
            onStartShouldSetPanResponder: (evt, gestureState) => true,
            onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
            onMoveShouldSetPanResponder: (evt, gestureState) => true,
            onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
            onPanResponderMove: (evt, gestureState) => {
                Animated.event([null, {dx: translate.x, dy: translate.y}], {
                    useNativeDriver: false,
                })(evt, gestureState);
            },
            onPanResponderRelease: (evt, gestureState) => {
                
                Animated.spring(translate, {
                    toValue: {x: cords.viewX, y: cords.viewY},
                    speed: 200,
                    useNativeDriver: true,
                }).start();
            },
        }),
    ).current;
    return (
        <View style={{flex: 1}}>
            <Animated.View
                {...panResponder.panHandlers}
                onLayout={event => {
                    cords.viewX = event.nativeEvent.layout.x;
                    cords.viewY = event.nativeEvent.layout.y;
                }}
                style={{
                    backgroundColor: 'red',
                    width: 200,
                    height: 200,
                    margin: 40,
                    transform: [
                        {
                            translateX: translate.x,
                        },
                        {translateY: translate.y},
                    ],
                }}></Animated.View>
            <Text style={{position: 'absolute', marginLeft: 40}}>
                im a text
            </Text>
        </View>
    );
};

export default Cards;

if i change the animated.spring to

Animated.spring(translate, {
                    toValue: {x: 0, y: 0},
                    speed: 200,
                    useNativeDriver: true,
                }).start();

it works perfectly, why is that ? isn't viewX, viewY supposed to be the default cords for my view ?

0

There are 0 best solutions below