React Native 之ScrollView轮播图实现

1.首先如果文件index.android.js   或者 index.ios.js  我这里用的是前者


/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

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文件  这样方便图片的访问,资源图片放在项目名称\android\app\src\main\res\drawable 下面

这里的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
 * https://github.com/facebook/react-native
 * @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',
  }
});




链接:http://pan.baidu.com/s/1kVcAVTP 密码:e9kf

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值