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. Nginx 安装配置文件解析

    源地址:https://www.cnblogs.com/Chiler/p/8027167.html 前言 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/P ...

  2. ubuntu14.06 Lts开启ssh服务

    (1) apt-get install openssh-server (2)检查ssh服务开启状态 (3)通过以下命令启动ssh服务 service ssh stop service ssh star ...

  3. Struts2 架构图

    Struts2架构图 请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher:Filt ...

  4. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

  5. Python3NumPy——常用函数

    Python3NumPy的常用函数 1. txt文件 (1) 单位矩阵,即主对角线上的元素均为1,其余元素均为0的正方形矩阵. 在NumPy中可以用eye函数创建一个这样的二维数组,我们只需要给定一个 ...

  6. 不涉及框架纯java实现将图片裁成圆形

    package com.wtsrui.utils;import java.awt.Color;  import sun.misc.BASE64Encoder;import java.awt.Graph ...

  7. Instruments

    链接: iOS性能优化:Instruments使用实战 iOS 使用Instruments的工具小结    

  8. copy unicode HTML to clipboard

    How to copy unicode HTML code to the clipboard in html format, so it can be pasted into Writer, Word ...

  9. WordPress主题开发:输出指定页面导航

    实例: <ul> <li class="widget widget_nav_menu"> <?php if(is_page(array(12,14,1 ...

  10. CSS网页布局垂直居中整理

    一.使用CSS3处理垂直居中方式 1.使用Flex布局处理(推荐),简单好用 body,html{ width:100%; height:100%; } .out { width: 20%; heig ...