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时,就是顶部可以在那里去做背景替换

相关推荐
EndingCoder1 小时前
React从基础入门到高级实战:React 实战项目 - 项目三:实时聊天应用
前端·react.js·架构·前端框架
阿阳微客2 小时前
Steam 搬砖项目深度拆解:从抵触到真香的转型之路
前端·笔记·学习·游戏
德育处主任Pro3 小时前
『React』Fragment的用法及简写形式
前端·javascript·react.js
CodeBlossom3 小时前
javaweb -html -CSS
前端·javascript·html
打小就很皮...4 小时前
HBuilder 发行Android(apk包)全流程指南
前端·javascript·微信小程序
集成显卡5 小时前
PlayWright | 初识微软出品的 WEB 应用自动化测试框架
前端·chrome·测试工具·microsoft·自动化·edge浏览器
前端小趴菜056 小时前
React - 组件通信
前端·react.js·前端框架
Amy_cx6 小时前
在表单输入框按回车页面刷新的问题
前端·elementui
dancing9996 小时前
cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能
前端·javascript·typescript·游戏程序
后海 0_o7 小时前
2025前端微服务 - 无界 的实战应用
前端·微服务·架构