ReactNative下拉手势,PanResponder

代码开始

import React from 'react';
import { width } from '@/utils'
import { StyleSheet, View, PanResponder, Animated, Text } from 'react-native';
import { useState } from 'react';

// const viewHeight = 300;

const App: React.FC<{}> = () => {
    const position: any = new Animated.ValueXY();

    const [animatedViewHeight, setAnimatedViewHeight] = useState(new Animated.Value(10))

    
    // 展开动画
    const viewAnimatedShow = () => {
        Animated.timing(animatedViewHeight, {
            toValue: 400,
            duration: 300,
            useNativeDriver: false,
        }).start()
    }

    // 这些动画
    const viewAnimatedHide = () => {
        Animated.timing(animatedViewHeight, {
            toValue: 0,
            duration: 300,
            useNativeDriver: false,
        }).start()
    }

    const panResponder = PanResponder.create({
        onStartShouldSetPanResponder: () => true,
        onPanResponderGrant: () => {
            position.setOffset({ x: position.x._value, y: position.y._value });
            position.setValue({ x: 0, y: 0 });
        },
        onPanResponderMove: Animated.event(
            [
                null,
                { dx: position.x, dy: position.y },
            ],
            { useNativeDriver: false, listener(event) {
                const nativeEvent = event.nativeEvent as any
                setAnimatedViewHeight(nativeEvent.locationY)
                console.log('event', event.target, nativeEvent.locationY)
            }, }
        ),
        onPanResponderRelease: (e, gestureState) => { // 结束动画
            console.log('手势结束', e, gestureState)
            // if (gestureState.dy>=0) {
            //     // 向下滑动
            //     if (viewHeight<200) {
            //         // TODO
            //     } else {
            //         // 结束位置在折叠线上,折叠
            //         viewAnimatedHide()
            //     }
            // } else {
            //     // 向上滑动
            //     if (viewHeight<200) {
            //         // 折叠
            //         viewAnimatedHide()
            //     } else {
            //         // 打开
            //         viewAnimatedShow()
            //     }
            // }
            //   Animated.spring(position, {
            //     toValue: { x: 0, y: 0 },
            //     friction: 5,
            //     useNativeDriver: false
            //   }).start();
        }
    });

    return (
        <View style={styles.container}>
            <Animated.View style={[styles.box, {
                height: animatedViewHeight,
            }]} {...panResponder.panHandlers}>
                <Text>hello world</Text>
            </Animated.View>
        </View>
    );
};

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
    box: {
        width,
        backgroundColor: 'blue'
    }
});

export default App;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执念1012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值