React Native中的組件ScrollView類似於iOS中的UIScrollView,其基本的使用方法和熟悉如下:
/** * Sample React Native App * https://github.com/facebook/react-native * 周少停 ScrollView 的常用屬性 * 2016-09-19 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, ScrollView, AlertIOS, View } from 'react-native'; var Dimensions = require('Dimensions'); var {width,height} = Dimensions.get('window'); class Project extends Component { render() { return ( <View style={styles.container}> <ScrollView horizontal={true} //排列方向:橫向 默認false縱向 showsHorizontalScrollIndicator={false} //隱藏水平線 pagingEnabled={true} //分頁滑動 iOS // scrollEnabled={false} //是否滾動 iOS bounces={false} //關閉彈簧效果 iOS onScrollBeginDrag={()=>this.beginDrag()} //開始滑動時調用 onScrollEndDrag={()=>this.endDrag()} //結束滑動時調用 onMomentumScrollEnd={()=>this.momentumScroll()}//當一幀滑動完畢后調用 > {this.renderChildView()} </ScrollView> </View> ); } renderChildView(){ //數組 var allChild = []; var colors = ['red','blue','yellow','cyan','purple']; //遍歷 for(var i=0; i<5;i++){ allChild.push( //裝載 <View key={i} style={{backgroundColor:colors[i],width:width,height:120}}> <Text>{i}</Text> </View> ); } //返回 return allChild; } beginDrag(){ // AlertIOS.alert('開始滑動'); } endDrag(){ // AlertIOS.alert('滑動結束'); } momentumScroll(){ // AlertIOS.alert('一幀結束') } } const styles = StyleSheet.create({ }); AppRegistry.registerComponent('Project', () => Project);
demo:
/** * Sample React Native App * https://github.com/facebook/react-native * 周少停 ScrollView demo * 2016-09-20 */ //首先導入計時器類庫: //終端: cd 項目根目錄 // npm i react-timer-mixin --save //noinspection JSUnresolvedVariable import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, ScrollView, Image, View } from 'react-native'; //引入計時器類庫 var TimerMixin = require('react-timer-mixin'); //引入json數據 var ImageData = require('./imageTitleJson.json'); //引入Dimensions var Dimensions = require('Dimensions'); var width = Dimensions.get('window').width; var Project = React.createClass({ mixins: [TimerMixin], //注冊計時器 //設置固定值 getDefaultProps(){ return{ //時間間隔 duration : 2000 } }, //設置page的初始值和可變值 //默認第一頁選中 getInitialState(){ return { //當前頁碼 currentPage : 0 }; }, render() { return ( <View style={styles.container}> <ScrollView ref="scrollView" style={styles.scrollViewStyle} horizontal={true} //水平排列 pagingEnabled={true} //分頁滑動 onMomentumScrollEnd={(e)=>this.onAnimationEnd(e)} //一幀結束回調,去除()表示把該組件作為參數傳過去 onScrollBeginDrag={this.BeginDrag} //開始拖拽就停止定時器 onScrollEndDrag={this.EndDrag} //停止拖拽就啟動定時器 > {this.readerAllImage()} </ScrollView> {/*返回六點*/} <View style={styles.pageViewStyle}> {this.renderPage()} </View> </View> ); }, BeginDrag(){ //停止定時器 this.clearInterval(this.timer); }, EndDrag(){ //開啟定時器 this.startTimer(); }, //實現一些復雜操作 componentDidMount(){ //開啟定時器 this.startTimer(); }, //實現定時器 startTimer(){ //得到scrollView var scrollView = this.refs.scrollView; var imgsArr = ImageData.data; //添加定時器 this.timer = this.setInterval(function () { //設置圓點 var activePage = 0; //判斷 if((this.state.currentPage+1) >= imgsArr.length){//越界 activePage = 0; }else{ activePage = this.state.currentPage + 1; } //更新狀態機 this.setState({ currentPage:activePage }); //讓scorllView動起來 var offsetX = activePage * width; scrollView.scrollResponderScrollTo({x:offsetX,y:0,animation:true}); },this.props.duration); }, //返回圖片 readerAllImage(){ //數組 var allImage = []; //拿到圖片數組 var imgsArr = ImageData.data; //遍歷 for(var i=0; i<imgsArr.length;i++){ //去除單獨的image var imgItem = imgsArr[i]; //創建組件裝入數組 allImage.push( <Image key={i} source={{uri:imgItem.img}} style={{width:width,height:120}}/> ); } //返回數組 return allImage; }, //返回圓點 renderPage(){ //定義一個數組放置所有圓點 var indicatorArr = []; //拿到圖片數組 var imgsArr = ImageData.data; //圓點顏色style var style; //遍歷 for(var i = 0;i<imgsArr.length;i++){ //判斷 style = (i==this.state.currentPage) ? {color:'red'} : {color:'white'} //裝載進數組中 indicatorArr.push( <Text key={i} style={[{fontSize:25},style]}>•</Text> ); } return indicatorArr; }, //當一幀結束時,調用 onAnimationEnd(e){ //求出水平方向的偏移量 var offSetX = e.nativeEvent.contentOffset.x; //求出當前的page var currentPage = Math.floor(offSetX/width); //更新狀態機,修改繪制UI this.setState({ currentPage : currentPage }); } }); const styles = StyleSheet.create({ container:{ marginTop:20 }, scrollViewStyle:{ }, pageViewStyle: { width:width, height:25, backgroundColor:'rgba(0,0,0,0)', position:'absolute',//絕對定位 bottom:0, bottom:0, flexDirection:'row',//主軸方向 alignItems:'center' } }); AppRegistry.registerComponent('Project', () => Project);
涉及到json:
{ "data":[ { "img":"img_01", "title":"叔叔,我們不約" }, { "img":"img_02", "title":"看好,我要變形了" }, { "img":"img_03", "title":"奇變偶不變,符號看象限" }, { "img":"img_04", "title":"其實,我是你老爹" }, { "img":"img_05", "title":"伯母.您好,我是您兒子的男朋友" }, { "img":"img_06", "title":"該吃葯了" } ] }
React Native 中StatusBar的相關屬性,其他一些屬性只限於安卓,一些屬性只限於iOS,具體看React Native中文網
/** * Sample React Native App * https://github.com/facebook/react-native * 周少停 2016-09-27 * StatusBar狀態欄 * **/ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, StatusBar, } from 'react-native'; class Project extends Component{ render() { return ( <View style={styles.container}> <StatusBar // hidden = {true} //status顯示與隱藏 // backgroundColor = 'red' //status欄背景色,僅支持安卓 // translucent = {true} //設置status欄是否透明效果,僅支持安卓 // barStyle = 'light-content' //設置狀態欄文字效果,僅支持iOS,枚舉類型:default黑light-content白 networkActivityIndicatorVisible = {true} //設置狀態欄上面的網絡進度菊花,僅支持iOS showHideTransition = 'slide' //顯隱時的動畫效果.默認fade /> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', } }); AppRegistry.registerComponent('Project', () => Project);
React NAtive中的TabBarIos也就是iOS中的UITabBarController,這里的TabBarIos僅可以iOS使用,若需安卓也適用,可以尋求第三方庫。
/** * Sample React Native App * https://github.com/facebook/react-native * 周少停 TabBarIos TabBarIos.Item * 2016-09-22 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, TabBarIOS, View } from 'react-native'; var Project = React.createClass({ //設置初始值 getInitialState(){ return{ //默認選中第一個Item selectedTabBarItem: 'home' } }, render() { return ( <View style={styles.container}> <TabBarIOS barTintColor='black'> <TabBarIOS.Item systemIcon="bookmarks" badge="3" selected = {this.state.selectedTabBarItem == 'home'} onPress = {()=>{this.setState({selectedTabBarItem: 'home'})}} > <View style={[styles.commonViewStyle,{backgroundColor: 'red'}]}> <Text>首頁</Text> </View> </TabBarIOS.Item> <TabBarIOS.Item systemIcon="more" selected = {this.state.selectedTabBarItem == 'second'} onPress = {()=>{this.setState({selectedTabBarItem: 'second'})}} > <View style={[styles.commonViewStyle,{backgroundColor:'yellow'}]}> <Text>第二頁</Text> </View> </TabBarIOS.Item> <TabBarIOS.Item systemIcon="downloads" selected = {this.state.selectedTabBarItem == 'three'} onPress = {()=>{this.setState({selectedTabBarItem: 'three'})}} > <View style={[styles.commonViewStyle,{backgroundColor:'cyan'}]}> <Text>第三頁</Text> </View> </TabBarIOS.Item> <TabBarIOS.Item // systemIcon="contacts" icon = {require('./1.png')} badge="6" selected = {this.state.selectedTabBarItem == 'four'} onPress = {()=>{this.setState({selectedTabBarItem: 'four'})}} > <View style={[styles.commonViewStyle,{backgroundColor:'blue'}]}> <Text>第四頁</Text> </View> </TabBarIOS.Item> </TabBarIOS> </View> ); } }); const styles = StyleSheet.create({ container:{ flex:1, backgroundColor:'#f5fcff', }, commonViewStyle:{ flex:1, justifyContent:'center', alignItems:'center' } }); AppRegistry.registerComponent('Project', () => Project);
完整源碼下載:https://github.com/pheromone/React-Native-1