React Native常用组件之ScrollView
http://reactnative.cn/docs/0.25/scrollview.html#content
1.需要导入计时器类库
cd到项目根目录下执行:
$ npm i react-timer-mixin --save
在项目中需要引入并注册:
引入: var TimerMixin = require('react-timer-mixin');
注册:mixins: [TimerMixin],
/**
* 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';
// 引入Dimensions类库
var Dimensions = require('Dimensions');
var ScreenW = Dimensions.get('window').width;
// 引入计时器类库
var TimerMixin = require('react-timer-mixin');
// 加载json数据
var ImageData = require('./ImageData.json');
var ScrollViewDemo = React.createClass({
// 注册计时器
mixins: [TimerMixin],
// 设置可变和初始化值
getInitialState(){
return{
// 当前页面
currentPage:0,
}
},
render() {
return (
<View style={styles.container}>
<ScrollView
horizontal={true}
pagingEnabled={true}
showsHorizontalScrollIndicator={false}
// 当一帧滚动结束
onMomentumScrollEnd={this.onAnimationEnd}
>
{this.renderAllImage()}
</ScrollView>
<View style={styles.indicatorViewStyle}>
{this.renderPageCircle()}
</View>
</View>
);
},
// 返回图片
renderAllImage(){
// 数组
var allImage = [];
// 拿到图片数据
var imageArr = ImageData.data;
// 遍历
for(var i=0;i<imageArr.length;i++){
// 取出单个图片对象
var imgItem = imageArr[i];
// 创建组件装入数组
allImage.push(
<Image key={i} source={{uri:imgItem.img}} style={{width: ScreenW,height:150}} />
);
}
// 返回
return allImage;
},
// 返回分页指示器圆点
renderPageCircle(){
// 定义一个数组放置所有的圆点
var indicatorArr = [];
var imgArr = ImageData.data;
// 特殊样式
var style;
for(var i=0;i<imgArr.length;i++){
// 判断style
style = (i==this.state.currentPage) ? {color:'orange'} : {color:'#fff'};
indicatorArr.push(
<Text key={i} style={[{fontSize:40},style]}>•</Text>
);
}
return indicatorArr;
},
// 当一帧滚动结束的时候调用
onAnimationEnd(event){
// 1.计算水平方向偏移量
var offsetX = event.nativeEvent.contentOffset.x
// 2.计算当前页码
var page = Math.floor(offsetX / ScreenW);
// 3.更新状态机,重新绘制UI
this.setState({
currentPage:page
});
},
});
const styles = StyleSheet.create({
container:{
marginTop:20,
},
// 分页指示器样式
indicatorViewStyle:{
width:ScreenW,
height:25,
backgroundColor:'rgba(0,0,0,0.4)',
position:'absolute',
bottom:0,
// 设置主轴方向,让圆点水平排列
flexDirection:'row',
}
});
AppRegistry.registerComponent('ScrollViewDemo', () => ScrollViewDemo);
运行效果如下:
ImageData.json文件:
{
"data": [
{
"img" : "img_01",
"title" : "你那一笑倾国倾城"
},
{
"img" : "img_02",
"title" : "那里记录了最唯美的爱情故事"
},
{
"img" : "img_03",
"title" : "我怎么是一个剩女"
},
{
"img" : "img_04",
"title" : "生命中最后的四分钟"
},
{
"img" : "img_05",
"title" : "我们都需要治疗"
}
]
}