[RN] React Native 头部 滑动吸顶效果的实现

摘要:
==-1? 谢谢~~

 React Native 头部 滑动吸顶效果的实现

效果如下图所示:

[RN] React Native 头部 滑动吸顶效果的实现第1张 

实现方法:

一、吸顶组件封装

StickyHeader .js
import * as React from 'react';
import {StyleSheet, Animated} from "react-native";

/**
 * 滑动吸顶效果组件
 * @export
 * @class StickyHeader
 */
export default class StickyHeader extends React.Component {

    static defaultProps = {
        stickyHeaderY: -1,
        stickyScrollY: new Animated.Value(0),
    };

    constructor(props) {
        super(props);
        this.state = {
            stickyLayoutY: 0,
        };
    }

    // 兼容代码,防止没有传头部高度
    _onLayout = (event) => {
        this.setState({
            stickyLayoutY: event.nativeEvent.layout.y,
        });
    };

    render() {
        const {stickyHeaderY, stickyScrollY, children, style} = this.props;
        const {stickyLayoutY} = this.state;
        let y = stickyHeaderY !== -1 ? stickyHeaderY : stickyLayoutY;
        const translateY = stickyScrollY.interpolate({
            inputRange: [-1, 0, y, y + 1],
            outputRange: [0, 0, 0, 1],
        });

        return (
            <Animated.View
                onLayout={this._onLayout}
                style={
                    [
                        style,
                        styles.container,
                        {transform: [{translateY}]}
                    ]}
            >

                {children}

            </Animated.View>
        )
    }
}

const styles = StyleSheet.create({
    container: {
        zIndex: 100
    },
});

二、使用

import React, {Component} from 'react';
import {Animated, FlatList, Text, View, StyleSheet} from 'react-native';
import StickyHeader from "./StickyHeader";

export default class MovieListScreen extends Component {

    constructor(props) {
        super(props);
        this.state = {
            movieList: [1, 2, 3, 4, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8],

            scrollY: new Animated.Value(0),
            headHeight: -1
        };
    }

    _keyExtractor = (item, index) => index.toString();

    _itemDivide = () => {
        return <View style={{height: 1, backgroundColor: '#ccc'}}/>;
    };

    render() {
        return (
            <Animated.ScrollView
                style={{flex: 1}}
                onScroll={
                    Animated.event(
                        [{
                            nativeEvent: {contentOffset: {y: this.state.scrollY}} // 记录滑动距离
                        }],
                        {useNativeDriver: true}) // 使用原生动画驱动
                }
                scrollEventThrottle={1}
            >

                <View onLayout={(e) => {
                    let {height} = e.nativeEvent.layout;
                    this.setState({headHeight: height}); // 给头部高度赋值
                }}>
                    <View>
                        <Text style={styles.topHeader}>这是头部</Text>
                    </View>
                </View>

                <StickyHeader
                    stickyHeaderY={this.state.headHeight} // 把头部高度传入
                    stickyScrollY={this.state.scrollY}  // 把滑动距离传入
                >
                    <View>
                        <Text style={styles.tab}>这是顶部</Text>
                    </View>
                </StickyHeader>

                <FlatList
                    data={this.state.movieList}
                    renderItem={this._renderItem}
                    keyExtractor={this._keyExtractor}
                    ItemSeparatorComponent={this._itemDivide}
                />

            </Animated.ScrollView>

        )
    }

    _renderItem = (item) => {
        return (
            <View>
                <Text style={{height: 200}}>666</Text>
            </View>
        );
    };

}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
    topHeader: {
        height: 60,
        textAlign: "center",
    },
    tab: {
        height: 80,
        zIndex: 999,
        textAlign: "center",
        backgroundColor: "red"
    }
});

参考:

https://www.jb51.net/article/162381.htm

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/11045306.html

转载请著名出处!谢谢~~

免责声明:文章转载自《[RN] React Native 头部 滑动吸顶效果的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇『积累』Delphi函数大全7 天玩转 ASP.NET MVC — 第 1 天下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

微信小程序使用weui构建搜索栏(searchbar)+导航(navbar)

首先需要在lib目录中添加weui.wxss。searchbar和navbar结合主要解决两者的层次问题,即搜索框输入时,下方的检索结果能够覆盖住navbar。下面就开始发码啦:wxml部分:0}}"bindtap="clearInput"˃搜索˂viewclass="weui-search-bar__cancel-btn"hidden="{{!...

使用jsPlumb插件实现动态连线功能

jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起来,适用于开发Web上的图表、建模工具等,其实jsPlumb可能主要是用来做流程图的,它在实现这方面的功能上非常强大,我在项目中只使用了它少部分功能,来实现项目中连线的效果。...

Fiddler断点应用

对于不需要修改的报文,我们可以手动完成发送,fiddler会把拦截的网页发送到服务器或者客户端,需要修改的报文,可以在Fiddler修改完成后,再选择转发。另外,我们也可以使用Fiddler的断点功能模拟网络中断场景,验证服务器超时,客户端的处理情况。Afterresponses:服务器响应之后,在fiddler将响应传回给客户端之前。...

PowerQuery清理非文件名字符(清除指定列表中的所有字符)

在左侧导航窗格的空白区域右击,依次找到空白查询项接下来的思路是:遍历列表SearchList中的所有项,依次清理Data表中所有想要处理的列。第三个参数是一个函数:它告诉List.Accumulate函数,在每一次使用SearchList中某一项操作Data表时,其操作的方式是如何的。...

java--枚举

前言:Java中的enum也是一种类类型,它与一般类的区别在于1.世界上只有一个实例2.不能有公共构造函数3。您不能继承和继承枚举事例publicenumHttpCode{SUCCESS(200,“操作成功”)。//定义的每个枚举项都等效于通过构造函数HttpCode(int code,Stringmessage)实例化没有枚举项的通用HttpCo...

利用油猴插件实现全网VIP视频免费看

利用油猴插件实现全网VIP视频免费看第一步:首先打开谷歌应用商店搜索tampermonkey安装这个插件第二步:在百度搜索框搜索油猴可以看到以下页面,点击进入。下载谷歌上网助手解压后,将后缀为crx的文件拖入即可。之后注册一个谷歌上网助手账后登录即可进入谷歌应用商店油猴插件...