1. 两个要点

1.1 ScrollView必须有一个确定的高度才能正常工作

  • 它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作)

    • 通常有两种做法:
    • 第一种: 直接给该ScrollView进行高度设置(不建议)
    • 第二种: ScrollView中不要加{flex:1}
  • ScrollView内部的其他响应者尚无法阻止ScrollView本身成为响应者

2. ScrollView中常用的属性

  • contentContainerStyle StyleSheetPropType(ViewStylePropTypes)

    这些样式会应用到一个内层的内容容器上,所有的自视图都会包裹在内容容器内

  • horizontal bool

    当此属性为true的时候,所有的自视图会在水平方向上排成一行,而不是默认的在垂直方向上排成一行,默认值为false

  • keyboardDismissMode enum('none', "interactive", 'on-drag')

    用户拖拽滚动视图的时候,是否要隐藏软键盘

    • none(默认值),拖拽时不隐藏软键盘
    • on-drag 当拖拽开始的时候隐藏软键盘
    • interactive 软键盘伴随拖拽操作同步的消失,并且如果往上滑动会回复键盘,安卓设备不支持这个选项,会变现的和none一样
  • keyboardShouldPersistTaps bool

    当此属性为false的时候,在软键盘激活之后,点击焦点文本输入框以外的地方,键盘就会隐藏.如果为true,滚动视图不会响应点击操作,并且键盘不会自动消失.默认值为false

  • onScroll function

    在滚动的过程中,每帧最多调用一次此回调函数。调用的频率可以用scrollEventThrottle属性来控制。

  • refreshControl element

    指定RefreshControl组件,用于为ScrollView提供下拉刷新功能。

  • removeClippedSubviews bool

    (实验特性):当此属性为true时,屏幕之外的子视图(子视图的overflow样式需要设为hidden)会被移除。这个可以提升大列表的滚动性能。默认值为true。

  • showsHorizontalScrollIndicator bool

    当此属性为true的时候,显示一个水平方向的滚动条。

  • showsVerticalScrollIndicator bool

    当此属性为true的时候,显示一个垂直方向的滚动条。

  • alwaysBounceHorizontal bool

当此属性为true时,水平方向即使内容比滚动视图本身还要小,也可以弹性地拉动一截。当horizontal={true}时默认值为true,否则为false。

  • iosalwaysBounceVertical bool

当此属性为true时,垂直方向即使内容比滚动视图本身还要小,也可以弹性地拉动一截。当horizontal={true}时默认值为false,否则为true。

  • iosautomaticallyAdjustContentInsets bool

如果滚动视图放在一个导航条或者工具条后面的时候,iOS系统是否要自动调整内容的范围。默认值为true。(译注:如果你的ScrollView或ListView的头部出现莫名其妙的空白,尝试将此属性置为false)

  • iosbounces bool

当值为true时,如果内容范围比滚动视图本身大,在到达内容末尾的时候,可以弹性地拉动一截。如果为false,尾部的所有弹性都会被禁用,即使alwaysBounce*属性为true。默认值为true。

  • iosbouncesZoom bool

当值为true时,使用手势缩放内容可以超过min/max的限制,然后在手指抬起之后弹回min/max的缩放比例。否则的话,缩放不能超过限制。

  • ioscanCancelContentTouches bool

当值为false时,一旦有子节点响应触摸操作,即使手指开始移动也不会拖动滚动视图。默认值为true(在以上情况下可以拖动滚动视图。)

  • ioscenterContent bool

当值为true时,如果滚动视图的内容比视图本身小,则会自动把内容居中放置。当内容比滚动视图大的时候,此属性没有作用。默认值为false。

  • ioscontentInset {top: number, left: number, bottom: number, right: number}

内容范围相对滚动视图边缘的坐标。默认为{0, 0, 0, 0}。

  • ioscontentOffset PointPropType

用来手动设置初始的滚动坐标。默认值为{x: 0, y: 0}。

  • iosdecelerationRate number

一个浮点数,用于决定当用户抬起手指之后,滚动视图减速停下的速度。常见的选项有:

Normal: 0.998 (默认值)

Fast: 0.9

  • iosdirectionalLockEnabled bool

当值为真时,滚动视图在拖拽的时候会锁定只有垂直或水平方向可以滚动。默认值为false。

  • iosmaximumZoomScale number

允许的最大缩放比例。默认值为1.0。

  • iosminimumZoomScale number

允许的最小缩放比例。默认值为1.0。

  • iosonRefreshStart function

已过期

请使用refreshControl 属性代替。

  • iosonScrollAnimationEnd function

当滚动动画结束之后调用此回调。

  • iospagingEnabled bool

当值为true时,滚动条会停在滚动视图的尺寸的整数倍位置。这个可以用在水平分页上。默认值为false。

  • iosscrollEnabled bool

当值为false的时候,内容不能滚动,默认值为true。

  • iosscrollEventThrottle number

这个属性控制在滚动过程中,scroll事件被调用的频率(单位是每秒事件数量)。更大的数值能够更及时的跟踪滚动位置,不过可能会带来性能问题,因为更多的信息会通过bridge传递。默认值为0,意味着每次视图被滚动,scroll事件只会被调用一次。

  • iosscrollIndicatorInsets {top: number, left: number, bottom: number, right: number}

决定滚动条距离视图边缘的坐标。这个值应该和contentInset一样。默认值为{0, 0, 0, 0}。

  • iosscrollsToTop bool

当此值为true时,点击状态栏的时候视图会滚动到顶部。默认值为true。

  • iossnapToAlignment enum('start', "center", 'end')

    • 当设置了snapToInterval,snapToAlignment会定义停驻点与滚动视图之间的关系。

    • start (默认) 会将停驻点对齐在左侧(水平)或顶部(垂直)

    • center 会将停驻点对齐到中间

    • end 会将停驻点对齐到右侧(水平)或底部(垂直)

  • iossnapToInterval number

当设置了此属性时,会让滚动视图滚动停止后,停止在snapToInterval的倍数的位置。这可以在一些子视图比滚动视图本身小的时候用于实现分页显示。与snapToAlignment组合使用。

  • iosstickyHeaderIndices [number]

一个子视图下标的数组,用于决定哪些成员会在滚动之后固定在屏幕顶端。举个例子,传递stickyHeaderIndices={[0]}会让第一个成员固定在滚动视图顶端。这个属性不能和horizontal={true}一起使用。

  • ioszoomScale number

滚动视图内容初始的缩放比例。默认值为1.0。

  • OnMomentumScrollEnd function

    当一帧滚动完毕的时候调用,e.nativeEvent.contentOffset。

  • onScrollBeginDrag fuction

    当开始手动拖拽的时候调用。

  • onScrollEndDrag fuction

    当结束手动拖拽的时候调用。

注意:ScrollView是继承自View,所以View中所有的属性同样适用于ScrollView。

3. Demo

3.1 用ScrollView实现轮播图效果

技术实现要点

  • 需要导入计时器类库

npm i react-timer-mixin --save


- 在项目中需要引入并注册
- 引入: ```
var TimerMixin = require('react-timer-mixin');
    - 注册: ```
mixins: [TimerMixin]
```
  • 在上下文中拿到组件需要给组件绑定ref
<ScrollView
ref="scrollView"
horizontal={true}
pagingEnabled={true} // 是否启用分页
showsHorizontalScrollIndicator={false} // 是否显示横向滚动条
onMomentumScrollEnd={(e) => this.onScrollAnimationEnd(e)}
onScrollBeginDrag={() => this.onScrollBeginDrag()} // 开始拖拽时调用的方法
onScrollEndDrag={() => this.onScrollEndDrag()} // 结束拖拽时调用的方法
>
{this.renderScrollView()}
</ScrollView>
  • 根据上下文求出偏移量
e.nativeEvent.contentOffset.x;
  • 让ScrollView根据偏移量进行滚动
// 处理scrollView的滚动
var offsetX = activePage * width;
scrollView.scrollResponderScrollTo({x: offsetX, y: 0, animated: true});

3.2 demo代码

/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/ import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
ScrollView,
Image
} from 'react-native'; var TimerMixin = require('react-timer-mixin'); // 引入数据文件
var imgData = require('./ImageData.json');
var {width, height} = require('Dimensions').get('window'); var rn0908ScrollView = React.createClass({ // 注册定时器
mixins: [TimerMixin], getDefaultProps() {
return {
duration: 2000
}
}, // 初始化状态机函数
getInitialState() {
return {
// 当前页数
currentPage: 0
}
}, render() {
return (
<View style={styles.container}>
<ScrollView
ref="scrollView"
horizontal={true}
pagingEnabled={true} // 是否启用分页
showsHorizontalScrollIndicator={false} // 是否显示横向滚动条
onMomentumScrollEnd={(e) => this.onScrollAnimationEnd(e)} // 滚动一帧结束时调用
onScrollBeginDrag={() => this.onScrollBeginDrag()} // 开始拖拽时调用的方法
onScrollEndDrag={() => this.onScrollEndDrag()} // 结束拖拽时调用的方法
>
{this.renderScrollView()}
</ScrollView>
<View style={styles.indicator}>
{this.renderIndicator()}
</View>
</View>
);
},
componentDidMount() { // 开启定时器
this.startInterval();
},
/**
* 开启定时器的方法
*/
startInterval() {
this.timer = this.setInterval(function () {
var scrollView = this.refs.scrollView;
var activePage = 0;
var currentpage = this.state.currentPage;
var modelsCount = imgData.data.length;
if (currentpage + 1 >= modelsCount) {
activePage = 0;
} else {
activePage = currentpage + 1;
}
this.setState({
currentPage: activePage
}); // 处理scrollView的滚动
var offsetX = activePage * width;
scrollView.scrollResponderScrollTo({x: offsetX, y: 0, animated: true});
}, this.props.duration);
},
/**
* ScrollView开始拖拽时调用
*/
onScrollBeginDrag() {
this.clearInterval(this.timer);
},
/**
* 结束拖拽时调用
*/
onScrollEndDrag() {
this.startInterval();
},
/**
* 渲染ScrollView
* @returns {Array}
*/
renderScrollView() {
// UIs
var uis = [];
var models = imgData.data;
for (var i = 0; i < models.length; i++) {
uis.push(
<Image style={{height: 120, width: width, backgroundColor: 'red'}} source={{uri: models[i].img}} key={i}/>
);
}
return uis;
},
/**
* 渲染轮播图指示器
* @returns {Array}
*/
renderIndicator() {
var indicators = [];
var models = imgData.data; var style;
var currentPage = this.state.currentPage; for (var i = 0; i < models.length; i++) {
style = i == currentPage ? {color: 'orange'} : {color: '#fff'};
indicators.push(
<Text key={i} style={[{marginLeft: 5, fontSize: 10}, style]}>●</Text>
);
}
return indicators;
},
/**
* 滚动一帧结束后调用
* @param e
*/
onScrollAnimationEnd(e) {
// 获取x方向的偏移量
var offsetX = e.nativeEvent.contentOffset.x;
// 计算页数
var currentPage = Math.floor(offsetX / width); // 改变状态机
this.setState({
currentPage: currentPage
});
}
}); const styles = StyleSheet.create({
container: {},
indicator: {
backgroundColor: 'rgba(0,0,0,0.5)',
height: 20,
width: width,
position: 'absolute',
bottom: 0,
flexDirection: 'row',
alignItems: 'center'
}
}); AppRegistry.registerComponent('rn0908ScrollView', () => rn0908ScrollView);

3.3 效果图

感谢作者,原文地址,戳我

React Native常用组件之ScrollView的更多相关文章

  1. React Native常用组件之ScrollView组件

    一.前言 从iOS开发的经验来看,scrollView无疑是移动开发中很重要的一个组件,比如后面会学到的ListView就是继承自它.那么,在开发中比如:焦点图.引导页等地方都有其的影子,那接下来我们 ...

  2. React Native常用组件在Android和IOS上的不同

    React Native常用组件在Android和IOS上的不同 一.Text组件在两个平台上的不同表现 1.1 height与fontSize 1.1.1只指定font,不指定height 在这种情 ...

  3. React Native常用组件之ListView

    1. ListView常用属性 ScrollView 相关属性样式全部继承 dataSource ListViewDataSource 设置ListView的数据源 initialListSize n ...

  4. React Native常用组件之ListView组件

    学习iOS开发的同学应该都知道UITableView,几乎每个APP中都有它的存在,而且衍生出各种形态:那么同样,ListView就是在React Native中的tableView,而且更加简单和灵 ...

  5. react native 常用组件汇总

    react-native-uploader //文件上传https://github.com/aroth/react-native-uploader jpush-react-native //官方版本 ...

  6. 一起来点React Native——常用组件之Touchable系列

    在前面的登录界面中,我们发现所有的组件不会对用户的点击.触摸.拖拽做出合适的响应,这是十分不友好的.那么,在React Native中如何让视图对触发做出合适的响应呢? 一.高亮触摸  Touchab ...

  7. React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方

    以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation  react-native ...

  8. React Native常用组件Image使用

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  9. 一起来点React Native——常用组件之Image

    一.前言 在开发中还有一个非常重要的组件Image,通过这个组件可以展示各种各样的图片,而且在React Native中该组件可以通过多种方式加载图片资源. 二.Image组件的基本用法 2.1 从当 ...

随机推荐

  1. how to generate an analog output from a in-built pwm of Atmega 32AVR microcontrloller?

    how to generate an analog output from a in-built pwm of Atmega 32AVR microcontrloller? you need a re ...

  2. 总结&#183;展望

    学了算法也有半年了.也是学期末,确实是该总结了.半年来说不上多努力,毕竟不如高中那时候早晨5点起晚上12点睡,但也确实学到不少东西(尽管眼下来说根本用不到并且我也不确定以为会不会去用.毕竟专业放在那里 ...

  3. POJ2456 Aggressive cows 二分

    Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...

  4. mock获取入参数并动态设置返回值

    /*   * Copyright (c) 2007 Mockito contributors   * This program is made available under the terms of ...

  5. bug Spring Mvc中Jsp页面获取不到Controller中的变量

    今天遇到了一个奇怪的问题: jsp代码如下: <h1>数据对比${name}</h1> 在controller里面,有赋值: @RequestMapping(value = & ...

  6. 001_ASP.NET MVC 实用教程 论坛项目 北盟网校 原创视频教程

    下载地址 http://pan.baidu.com/s/1kUJalbp 在线观看地址 http://www.bamn.cn/course/lesson/1 ASP.NET MVC 使用课程,是201 ...

  7. sqlserver修改主键为自增

    使用PowerDesigner创建一张表, 拷贝建表语句发现ID不是自增的, 以下是修改语句: ALTER TABLE USER_JOB_EXE_REC DROP COLUMN id; , ); 注: ...

  8. 100个MySQL 的调节和优化的提示

    100个MySQL 的调节和优化的提示 MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧. ...

  9. 使用jackson来进行数组格式的json字符串转换成List。

    有一个字符串如下.如下,也是通过jackson把list转换成的json字符串,我想把它转过来,看网上的内容都不尽人如意,都是片断的内容.估计只有写的知道怎么使用,所以就直接看了jackson的官网, ...

  10. [转]三步完成Source Insight 4.0 破解安装

    下载地址有更新,之前有朋友因潜在的版权问题封禁没下到,现在更新后可正常使用了. 文末有完全清除上次安装残留的方法,需要的人可以参考. —— 更新于 2018.1.21 第一步:安装    安装sour ...