1、ScrollView介紹(官方解釋):
ScrollView是一個(gè)通用的可滾動(dòng)的容器,你可以在其中放入多個(gè)組件和視圖,而且這些組件并不需要是同類型的。ScrollView不僅可以垂直滾動(dòng)(默認(rèn)),還能水平滾動(dòng)(通過horizontal屬性來設(shè)置)。
2、ScrollView常用屬性:
horizontal(布爾值):當(dāng)此屬性為true的時(shí)候,所有的的子視圖會(huì)在水平方向上排成一行,而不是默認(rèn)的在垂直方向上排成一列。默認(rèn)值為false。
showsHorizontalScrollIndicator(布爾值):當(dāng)此屬性為true的時(shí)候,顯示一個(gè)水平方向的滾動(dòng)條。
showsVerticalScrollIndicator(布爾值):與showsHorizontalScrollIndicator相對(duì),當(dāng)此屬性為true的時(shí)候,顯示一個(gè)垂直方向的滾動(dòng)條。
OnMomentumScrollEnd(function) :當(dāng)一幀滾動(dòng)完畢的時(shí)候調(diào)用,e.nativeEvent.contentOffset,可以用來獲取偏移量。
onScrollBeginDrag(function) :當(dāng)開始手動(dòng)拖拽的時(shí)候調(diào)用。
onScrollEndDrag(function) :當(dāng)結(jié)束手動(dòng)拖拽的時(shí)候調(diào)用。
onScroll(function) :在滾動(dòng)的過程中,每幀最多調(diào)用一次此回調(diào)函數(shù)。調(diào)用的頻率可以用scrollEventThrottle屬性來控制。
*注意:ScrollView是繼承自View,所以View中所有的屬性同樣適用于ScrollView。在此只介紹幾個(gè)常見的android和ios通用屬性。更多詳細(xì)屬性請(qǐng)移步到此處
例子:縱向滑動(dòng)
export default class App extends Component<{}> {
render() {
const screenWidth = Dimensions.get('window').width;
return (
<View style={styles.container}>
<View>
<Text
style={styles.welcome}
>
頭部
</Text>
</View>
<ScrollView
ref="scrollView"
horizontal={false}
showsHorizontalScrollIndicator={false}
pagingEnabled={true}
>
<Text
style={styles.welcome}
>
ScrollView 縱向滑動(dòng)
</Text>
<Image source={{ uri: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494233305839&di=e1647289d1fcd778f64ddf3ccaf6fcfa&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2012%2F1016%2Fgha%2F1%2F1350006791532.jpg"}}
style={{width:screenWidth,height:240}}></Image>
<Image source={{ uri: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494236802350&di=72da30f79403ec28b124424f2c24a9f6&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2014%2Flxy%2F2014%2F09%2F16%2F8.jpg"}}
style={{width:screenWidth,height:240}}></Image>
<Image source={{ uri: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494236734637&di=bb81b0fa9b2040542a4a6f9fcc2d0359&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2012%2F1016%2Fgha%2F1%2F1350006753179.jpg"}}
style={{width:screenWidth,height:240}}></Image>
</ScrollView>
</View>
);
}
}

例子:橫向 (自定義ScrollView)
import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
ScrollView,
Image
} from 'react-native';
var Dimensions = require('Dimensions');
var ScreenWidth=Dimensions.get('window').width;
class MyScrollViewTwo extends Component{
renderChilds= () =>{
var imgeList=['https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494233305839&di=e1647289d1fcd778f64ddf3ccaf6fcfa&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2012%2F1016%2Fgha%2F1%2F1350006791532.jpg'
,'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494236802350&di=72da30f79403ec28b124424f2c24a9f6&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2014%2Flxy%2F2014%2F09%2F16%2F8.jpg'
,'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494236734637&di=bb81b0fa9b2040542a4a6f9fcc2d0359&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2012%2F1016%2Fgha%2F1%2F1350006753179.jpg'
];
return imgeList.map((item,i)=>{
return<Image key ={`item${i}`} source={{uri:item}}
style={{width:ScreenWidth,height:240}}></Image>
});
}
render(){
return <ScrollView
horizontal={true}
showsHorizontalScrollIndicator={false}
pagingEnabled={true}
>
{this.renderChilds()}
</ScrollView>;
}
}
module.exports = MyScrollViewTwo;

例子自定義Banner
/**
* Created by Android on 2017/12/12.
*/
import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
ScrollView,
Image
} from 'react-native';
var Dimensions = require('Dimensions');
var ScreenWidth=Dimensions.get('window').width;
var imgeList=require('./jsons.json');
class Banner extends Component{
constructor(props){
super(props);
this.state={
currentPage:0
};
}
// 渲染圖片
renderChilds= () =>{
return imgeList.data.map((item,i)=>{
return<Image key ={`item${i}`} source={{uri:item.img}}
style={{width:ScreenWidth,height:240}}></Image>
});
}
/**
* 渲染圓
*/
renderCircles=()=>{
return imgeList.data.map((item ,i)=>{
var style = {};
//當(dāng)前頁面的的指示器,橘黃色
if(i === this.state.currentPage){
style = {color:'orange'};
}
return <Text key={`text${i}`} style={[styles.circleStyle,style]}>•</Text>
});
}
handleScroll = (e)=>{
var x = e.nativeEvent.contentOffset.x;
var currentPage = Math.floor(e.nativeEvent.contentOffset.x / ScreenWidth);
this.setState({currentPage:currentPage});
console.log("currentPage:"+currentPage);
}
//定時(shí)器
startTimer = ()=>{
this.timer = setInterval(()=>{
//計(jì)算出要滾動(dòng)到的頁面索引,改變state
var currentPage = ++this.state.currentPage == imgeList.data.length ? 0 : this.state.currentPage;
this.setState({currentPage:currentPage});
//計(jì)算滾動(dòng)的距離
var offsetX = currentPage * ScreenWidth;
this.refs.scrollView.scrollTo({x:offsetX,y:0,animated:true});
console.log(currentPage);
},2000);
}
//開始滑動(dòng)
handleScrollBegin = ()=>{
console.log("handleScrollBegin");
clearInterval(this.timer);
}
handleScrollEnd = ()=>{
console.log("handleScrollEnd");
this.startTimer();
}
render(){
return <View style={styles.flexDirection}>
{/*
return 后面不能回車
*/}
<ScrollView
ref="scrollView"
horizontal={true}
showsHorizontalScrollIndicator={false}
pagingEnabled={true}
onMomentumScrollBegin={this.handleScroll}
onScrollBeginDrag={this.handleScrollBegin}
onScrollEndDrag={this.handleScrollEnd}
>
{this.renderChilds()}
</ScrollView>
<View style={styles.circleWrapperStyle}>
{this.renderCircles()}
</View>
</View>;
}
//定時(shí)器 生命周期
componentDidMount = ()=>{
this.startTimer();
}
//取消定時(shí)器
componentWillUnmount =() => {
clearInterval(this.timer);
}
}
var styles =StyleSheet.create({
container: {
flexDirection:'column'
},
circleWrapperStyle:{
flexDirection:'row',
//absolute“絕對(duì)”定位,參照標(biāo)準(zhǔn)父容器
//relative “相對(duì)”對(duì)位,相對(duì)于原來的位置
position:'absolute',
bottom:0,
left:10
},
circleStyle:{
fontSize:25,
color:'#FFF'
}
});
module.exports = Banner;
return 后面不能回車

jsons.json
{
"data": [
{
"img" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494233305839&di=e1647289d1fcd778f64ddf3ccaf6fcfa&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2012%2F1016%2Fgha%2F1%2F1350006791532.jpg",
"title" : "你那一笑傾國傾城"
},
{
"img" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494236802350&di=72da30f79403ec28b124424f2c24a9f6&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2014%2Flxy%2F2014%2F09%2F16%2F8.jpg",
"title" : "那里記錄了最唯美的愛情故事"
},
{
"img" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1494236734637&di=bb81b0fa9b2040542a4a6f9fcc2d0359&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2012%2F1016%2Fgha%2F1%2F1350006753179.jpg",
"title" : "我怎么是一個(gè)剩女"
}
]
}