RN实现图片轮播

最近研究RN,对于我这个新手网上资料坑的一笔啊!!!ES5的旧资料在ES6 上各种错误,今天做了个最简单的轮播图,记录一下。有问题的地方还请大神们赐教!

我现在学习用的是vscode + android studio + xcode 如果大家有好用的软件或者插件欢迎大家评论给我 ,RN小白不胜感激。

imgData.json

    {
      "data":[
        {
          "img":"img_01",
          "title":"你那一笑倾城倾国"
        },{
          "img":"img_02",
          "title":"那里记录了最唯美的爱情故事"
        },{
          "img":"img_03",
          "title":"我怎么是一个剩女"
        },{
          "img":"img_04",
          "title":"生命中的最后四分钟"
        },{
          "img":"img_05",
          "title":"我们都需要治疗"
        }
      ]
    }

App.js

    import React, { Component } from 'react';
    import { Text ,View,StyleSheet, ScrollView, Image ,Dimensions} from 'react-native';

    import ImgData from './imgData.json';
    var {width,height} = Dimensions.get('window')


    export default class HelloWorldApp extends Component {
      

      static defaultProps = {

        //多少时间刷新一次
        duration:5000

      };

      constructor(props){
        super(props);

        this.state = {
          content:'',
          //当前页码
          currentPage:0
        }
        this.onScrollBeginDrag = this.onScrollBeginDrag.bind(this);
        this.onScrollEndDrag = this.onScrollEndDrag.bind(this);
        this.onAnimationEnd = this.onAnimationEnd.bind(this);
        this.timerScroll = this.timerScroll.bind(this);
      }
      //组件安装 在render之后调用一次 实现复杂的操作
      componentDidMount(){

        //开启定时器
        this.startTimer()
        

      }
      //开启定时器
      startTimer(){


        //2.添加定时器
        this.timerInterval = setInterval(
          ()=>{
            console.log('定时器开启')
            
            this.timerScroll();
            
          },this.props.duration);
      }
      //定时器滚动的处理
      timerScroll(){

        //0.拿到轮播视图scrollview
        var scrollview = this.refs.scrollView;
        
        var data = ImgData.data;

        //1设置圆点
        var activePage ;
        //2判断
        var  currentPage =  this.state.currentPage + 1
        if (currentPage >= data.length){
          activePage = 0
        }else{
          activePage = currentPage
        }
        //3更新状态机
        this.setState({
          currentPage:activePage,
          content:data[activePage].title
        })

        //4.滚动滚动视图
        var currentX = activePage * width
        scrollview.scrollTo({x: currentX,animated:true})
        scrollview.scrollResponderScrollTo


      }

      //组件即将卸载
      componentWillUnmount(){

        this.timerInterval && clearTimeout(this.timerInterval)
      }


      render() {
        
        return (
          <View style = {styles.container}>
            <ScrollView 
            ref = 'scrollView'
            horizontal={true}
            pagingEnabled={true}
            showsHorizontalScrollIndicator={false}
            //开始拖拽
            onScrollBeginDrag = {this.onScrollBeginDrag}
            //结束拖拽
            onScrollEndDrag = {this.onScrollEndDrag}
            //当一帧滚动结束
            onMomentumScrollEnd = {(e)=>this.onAnimationEnd(e)}
            >

              {this.renderAllImage()}

            </ScrollView>
            <View style={styles.pageViewStyle}>
              {/* 返回五个圆点 */}
              {this.renderPageCircle()}
            </View>

            {/* <Text>定时器示例:</Text>
            <Text>{this.state.content}</Text>
            <Text>{this.state.msg}</Text> */}
          </View>
        );
      }


      //返回图片
      renderAllImage(){

        var allImage = []; 
        var imgArr = ImgData.data;
        for(var i = 0; i < imgArr.length; i++){
          
          var imgItem = imgArr[i]
          allImage.push(

            <Image key = {i}  source={{uri:imgItem.img}} style= {styles.imgStyle}/>

          )

        }
        return allImage;
      }
      //返回圆点
      renderPageCircle(){

        var allCircle = []; 
        var imgArr = ImgData.data;

        var tyle;

        for(var i = 0; i < imgArr.length; i++){

          //判断
          style = ( i== this.state.currentPage )? {color:'orange'} : {color:'white'}
          
          var imgItem = imgArr[i]
          allCircle.push(
      
            <Text key = {i+100} style= {[styles.circleStyle,style]}>&bull;</Text>
          )

        }
        allCircle.push(
            
          <Text>{this.state.content}</Text>
        )
        return allCircle;
      }
      //开始拖拽
      onScrollBeginDrag(){
        //计时器停止
        this.timerInterval && clearTimeout(this.timerInterval)

      }
      //结束拖拽
      onScrollEndDrag(){
        //计时器开启
        this.startTimer()
      }
      //当一帧滚动结束的时候调用
      onAnimationEnd(e){
        // 获取滑动的偏移量
        var offSetX = e.nativeEvent.contentOffset.x;

        // 通过偏移量和屏幕宽度计算第几页
        var currentPage = Math.floor(offSetX/width);


        //  更新值已获取屏幕更新
        this.setState({
          currentPage:currentPage,
          content:ImgData.data[currentPage].title
        })


      }

    }

    const styles = StyleSheet.create({
      container:{

        marginTop:25,
      
      },
      imgStyle:{
        width:width,
        height:120,
      },
      pageViewStyle:{
        width:width,
        height:25,
        backgroundColor:'rgba(241,241,241,0.9)',
        //定位
        position:'absolute',
        bottom:0,
        //设置主轴的方向
        flexDirection:'row',
        //设置侧轴方向的对齐方式
        alignItems:'center',
      },
      circleStyle:{
        fontSize:25,
      },
    })
屏幕快照 2018-04-11 17.32.39.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,409评论 25 707
  • 目击阳朔角楼映射的夕阳苍茫一片 透过窗口的世界闭着左眼咫尺天涯 我把这苍茫归的窗归还给左眼 一个是虔诚,一个叫微笑...
    川哥不胖枉称豪阅读 171评论 0 1
  • 1、遇到This field is requierd错误如图示 使用request.FILES时,出现This f...
    MingSha阅读 562评论 0 0