RN向上向下滑动组件封装(带有渐变色)

这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样

代码如下

js 复制代码
import React, {useEffect, useRef, useState} from 'react';
import {
  View,
  PanResponder,
  Animated,
  StyleSheet,
  SafeAreaView,
  Dimensions,
  Text,
} from 'react-native';

const App = () => {
  const [colors, setColors] = useState('rgba(237, 36, 46, 1)');
  const scrollY = useRef(new Animated.Value(300)).current;
  const currentHeight = useRef(300);

  const panResponder = useRef(
    PanResponder.create({
      onStartShouldSetPanResponder: () => true,
      onPanResponderMove: (evt, gestureState) => {
        const newHeight = currentHeight.current - gestureState.dy;
        const clampedHeight = Math.min(
          Math.max(newHeight, 0),
          Dimensions.get('window').height,
        );
        scrollY.setValue(clampedHeight);
      },
      onPanResponderRelease: () => {
        currentHeight.current = scrollY._value;
      },
    }),
  ).current;

  useEffect(() => {
    const listener = scrollY.addListener(({value}) => {
      // console.log('ScrollY value changed:', value); // animail处的高度
      // console.log('Dimensions.get().height', Dimensions.get('window').height); // 设备总高度
      console.log(
        '上方View的高度等于总高度-下方animail的高度',
        Dimensions.get('window').height - value,
      );
      // 因为我这里需求是给View一个完整颜色,根据rgba值从0到1显示,因此我要将上面高度分成100份

      // 向上或者向下减少多少份 当前高度-总高度
      const nums =
        (Dimensions.get('window').height - value) /
        (Dimensions.get('window').height - 300);

      // 设置颜色
      setColors('rgba(237,36,46,' + nums + ')');
    });

    // 在组件卸载时移除监听器
    return () => {
      scrollY.removeListener(listener);
    };
  }, []);

  return (
    <View style={styles.container}>
      <View
        style={{
          backgroundColor: colors,
          width: 300,
          height: 50,
        }}></View>
      <Animated.View
        style={[
          styles.box,
          {
            height: scrollY.interpolate({
              inputRange: [0, 600],
              outputRange: [0, 600],
            }),
            backgroundColor: 'red',
          },
        ]}
        {...panResponder.panHandlers}>
        <SafeAreaView>
          {/* 占位内容 */}
          <Text>1111</Text>
        </SafeAreaView>
      </Animated.View>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  box: {
    position: 'absolute',
    bottom: 0,
    left: 0,
    right: 0,
  },
});

export default App;

效果图 初始效果 当往上滑动时效果 可以看出滑动过程中上方块的背景色被改变了,我这个块当顶部就停止滑动了

下面是我项目里面需要用的效果,当到顶部时会把背景做个替换,这个也就是在代码里面的nums为0时,就是顶部可以在那里去做背景替换

相关推荐
我登哥MVP18 分钟前
Ajax 详解
java·前端·ajax·javaweb
非凡ghost43 分钟前
Typora(跨平台MarkDown编辑器) v1.12.2 中文绿色版
前端·windows·智能手机·编辑器·软件需求
馨谙1 小时前
/dev/null 是什么,有什么用途?
前端·chrome
JamSlade2 小时前
流式响应 sse 系统全流程 react + fastapi为例子
前端·react.js·fastapi
徐同保2 小时前
react useState ts定义类型
前端·react.js·前端框架
liangshanbo12152 小时前
React 19 vs React 18全面对比
前端·javascript·react.js
望获linux2 小时前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
Never_Satisfied2 小时前
在 JavaScript 中,删除数组中内容为xxx的元素
java·前端·javascript
_菜鸟果果2 小时前
Vue3+echarts 3d饼图
前端·javascript·echarts
Luffe船长3 小时前
前端vue2+js+springboot实现excle导入优化
前端·javascript·spring boot