React Native 实现滑一点点内容区块指示器也滑一点点

效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。

实现思路如下:

1.监听列表滑动事件,获取列表横向滑动距离,假设为A;

2.获取列表的宽度,及列表可滑动的宽度,假设为B;

3.获取指示器宽度,及指示器可滑动的宽度;假设为C;

4.计算指示器滑动距离,假设为X;

5.根据 滑动距离/列表可滑宽度 = 滑动距离/指示器可滑宽度,得出A/B=X/C,

所以X= A/B * C,把ABC数据带进来,即可算出指示器滑动距离,并设置给指示器item的左间距。

代码实现如下:UI样式如下

复制代码
<View> 
                <FlatList
                    horizontal={true}
                    showsHorizontalScrollIndicator={false}
                    data={tripData}
                    renderItem={({item, index, separators}) => this.renderItem(item, index, length)}
                    keyExtractor={(item, index) => index.toString()}
                    renderScrollComponent={props => (<ScrollView {...props} />)}
                    getItemLayout={(data, index) => ({length: this.vItemWidth, offset: (this.vItemWidth + 5) * index, index})}
                    onTouchStart={(e) => this.scrollEnable(false)}
                    onTouchCancel={(e) => this.scrollEnable(true)}
                    onScroll={this.onScroll}/>

                {this.renderIndicator()}
            </View>


renderIndicator() {
        return(
            <View style={styles.indicatorContainer}>
                <View
                    ref={(view) => {this.indicatorView = view;}}
                    style={[styles.indicatorItem]}/>
            </View>);
    };

scrollEnable(enable) {
         //处理一些滑动冲突事件
    }

renderItem(item, index, length) {
//item的样式
}

滑动算法如下:

复制代码
onScroll = (event) => { 
        let nativeEvent = {...event.nativeEvent};
        let offsetX = nativeEvent.contentOffset.x;//用户横向滑动距离
        let indicatorWidth = styles.indicatorContainer.width;//指示器容器宽度
        let indicatorItemWidth = styles.indicatorItem.width;  //指示器宽度
        let indicatorLeft = offsetX / this.slideWidth * (indicatorWidth - indicatorItemWidth); 
        this.indicatorView.setNativeProps({
            marginLeft: indicatorLeft
        }); 
    };



//列表可滑距离=列表总宽度 - 单屏宽度
列表总宽度= item的宽度 * item的个数 + item间间距 * (item个数 - 1) + 左间距 + 有间距;
列表可滑距离 = 列表总宽度 - 单屏显示的宽度;
相关推荐
程序员大阳4 小时前
副队长JavaScript教程(50)-DOM:网页开发的起点
javascript·dom·es·节点·概念·document·关系
香芋芋圆8 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
晗夜未央10 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
jktantan11 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
我命由我1234511 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
程序员大阳12 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
paopaokaka_luck14 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
栀椩14 小时前
Electron 内嵌页面跨域问题(CORS/PNA)解决全记录
前端·javascript·electron
SEO_juper14 小时前
Chrome 扩展一键查看当前页面 SEO 信息:不用切页面,点一下全出来
前端·javascript·chrome
Highcharts.js14 小时前
CSUN 2026|Highcharts无障碍数据与AI分享
javascript·人工智能·数据分析·highcharts·图表开发