站长资讯网
最全最丰富的资讯网站

React Native 之ScrollView轮播图实现方法实例

1.index.Android.js

import React, { Component } from 'react';    import {      AppRegistry,      StyleSheet,      TextInput,      TouchableOpacity,      ScrollView,      Text,      View    } from 'react-native';        import ScrollViewDemo from "./scrollViewDemo";    import ScrollViewTop from "./scrollViewTop";    import PositionDemo from "./positionDemo";        export default class CQQLoginDemo extends Component {            render() {        return (        <ScrollViewTop/>        );      }        }    AppRegistry.registerComponent('CQQLoginDemo', () => CQQLoginDemo);

2.在项目的 index.android.js同一目录下 创建json文件 这样方便图片的访问,资源图片放在项目名称androidappsrcmainresdrawable 下面

这里的BadgeData.json 如下:

{      "data":[        {          "icon" : "danjianbao",          "title" : "单肩包"        },        {          "icon" : "liantiaobao",          "title" : "链条包"        },        {          "icon" : "qianbao",          "title" : "钱包"        },        {          "icon" : "shoutibao",          "title" : "手提包"        },        {          "icon" : "shuangjianbao",          "title" : "双肩包"        },        {          "icon" : "xiekuabao",          "title" : "斜挎包"        }      ]    }

3.主要的文件 scrollViewTop.js 文件 如下 具体注释中已写 直接上代码:

/**    * Sample React Native App    *     * @flow    */        import React, { Component } from 'react';    import {      AppRegistry,      StyleSheet,      ScrollView,      Image,      Text,      View    } from 'react-native';        let Dimensions = require('Dimensions');    let ScreenWidth = Dimensions.get('window').width;    let ScreenHeight = Dimensions.get('window').height;        import ImageData from "./BadgeData.json";         export  default class scrollViewTop extends Component {            constructor(props) {        super(props);        this.state = { currentPage: 0 };      }          static defaultProps = {        duration: 1000,      }          componentDidMount() {        this._startTimer();          }          componentWillUnmount() {        // 如果存在this.timer,则使用clearTimeout清空。        // 如果你使用多个timer,那么用多个变量,或者用个数组来保存引用,然后逐个clear      this.timer && clearTimeout(this.timer);      }          render() {        return (          <View style={styles.continer}>            <ScrollView              ref='scrollView'              //水平方向            horizontal={true}              //当值为true时显示滚动条            showsHorizontalScrollIndicator={false}              //当值为true时,滚动条会停在滚动视图的尺寸的整数倍位置。这个可以用在水平分页上            pagingEnabled={true}              //滑动完一贞            onMomentumScrollEnd={(e)=>{this._onAnimationEnd(e)}}              //开始拖拽            onScrollBeginDrag={()=>{this._onScrollBeginDrag()}}              //结束拖拽            onScrollEndDrag={()=>{this._onScrollEndDrag()}}              >              {this._renderAllImage()}            </ScrollView>            <View style={styles.pageViewStyle}>             {this._renderAllIndicator()}            </View>          </View>        );      }      /**开始拖拽 */      _onScrollBeginDrag(){        console.log("开始拖拽");        //两种清除方式 都是可以的没有区别        // this.timer && clearInterval(this.timer);      this.timer && clearTimeout(this.timer);      }      /**停止拖拽 */      _onScrollEndDrag(){        console.log("停止拖拽");        this.timer &&this._startTimer();      }          /**1.轮播图片展示 */      _renderAllImage() {        let allImage = [];        let imgsArr = ImageData.data;        for (let i = 0; i < imgsArr.length; i++) {          let imgsItem = imgsArr[i];         allImage.push(            <Image key={i} source={{uri:imgsItem.icon}} style={styles.imageStyle} />          );        }        return allImage;      }            /**2.手动滑动分页实现 */      _onAnimationEnd(e) {        //求出偏移量      let offsetX = e.nativeEvent.contentOffset.x;        //求出当前页数      let pageIndex = Math.floor(offsetX / ScreenWidth);        //更改状态机      this.setState({ currentPage: pageIndex });      }            /**3.页面指针实现 */        _renderAllIndicator() {        let indicatorArr = [];        let style;        let imgsArr = ImageData.data;        for (let i = 0; i < imgsArr.length; i++) {          //判断        style = (i==this.state.currentPage)?{color:'orange'}:{color:'white'};          indicatorArr.push(            <Text key={i} style={[{fontSize:30},style]}>             •            </Text>          );        }        return indicatorArr;      }          /**4.通过定时器实现自动播放轮播图 */        _startTimer(){        let scrollView = this.refs.scrollView;        this.timer = setInterval(          ()=>{console.log('开启定时器');            let imageCount = ImageData.data.length;           //4.1 设置圆点         let activePage = 0;           //4.2判断         if(this.state.currentPage>=imageCount+1){             activePage = 0;           }else{             activePage = this.state.currentPage+1;           }           //4.3 更新状态机         this.setState({currentPage:activePage});           //4.4 让scrollview 滚动起来         let offsetX = activePage * ScreenWidth;           scrollView.scrollResponderScrollTo({x:offsetX,y:0,animated:true});          },           this.props.duration         );        }    }      const styles = StyleSheet.create({      continer:{        backgroundColor: '#dddddd'      },      imageStyle:{        height:400,        width:ScreenWidth      },      pageViewStyle:{        height:25,        width:ScreenWidth,        backgroundColor:'rgba(0,0,0,0.4)',        position:'absolute',        bottom:0,            flexDirection:'row',        alignItems:'center',      }    });

React Native 之ScrollView轮播图实现方法实例

赞(1)
分享到: 更多 (0)