react-native实现轮播图

目录

一:需要的熟悉scrollView?

二:scrollView的常用属性 

三:轮播图


一:需要的熟悉scrollView?

scrollView无疑是移动开发中很重要的一个组件,比如后面会学到的ListView就是继承自它。那么,在开发中比如:焦点图、引导页等地方都需要它。注意:

  • scrollView必须有一个确定的高度才能正常工作;
    通常有两种做法:
      第一种: 直接给该ScrollView进行设置高度(不建议);
      第二种: ScrollView中不要加{flex:1}。
     
  • ScrollView内部的其他响应者尚无法阻止ScrollView本身成为响应者.
     

二:scrollView的常用属性 
 

  • contentContainerStyle:这些样式会应用到一个内层的内容容器上,所有的子视图都会包裹在内容容器内;
  • horizontal 当此属性为true的时候,所有的的子视图会在水平方向上排成一行,而不是默认的在垂直方向上排成一列。默认值为false。
  • keyboardDismissMode enum(‘none’, “interactive”, ‘on-drag’)
    用户拖拽滚动视图的时候,是否要隐藏软键盘。none(默认值),拖拽时不隐藏软键盘。on-drag :当拖拽开始的时候隐藏软键盘。interactive:软键盘伴随拖拽操作同步地消失,并且如果往上滑动会恢复键盘。安卓设备上不支持这个选项,会表现的和none一样。
  • keyboardShouldPersistTaps
    当此属性为false的时候,在软键盘激活之后,点击焦点文本输入框以外的地方,键盘就会隐藏。如果为true,滚动视图不会响应点击操作,并且键盘不会自动消失。默认值为false。
  • onScroll 在滚动的过程中,每帧最多调用一次此回调函数。调用的频率可以用scrollEventThrottle属性来控制。
  • refreshControl element
    指定RefreshControl组件,用于为ScrollView提供下拉刷新功能。
  • removeClippedSubviews bool
    (实验特性):当此属性为true时,屏幕之外的子视图(子视图的overflow样式需要设为hidden)会被移除。这个可以提升大列表的滚动性能。默认值为true。
  • showsHorizontalScrollIndicator bool
    当此属性为true的时候,显示一个水平方向的滚动条。
  • showsVerticalScrollIndicator bool
    当此属性为true的时候,显示一个垂直方向的滚动条。
  • alwaysBounceHorizontal bool

当此属性为true时,水平方向即使内容比滚动视图本身还要小,也可以弹性地拉动一截。当horizontal={true}时默认值为true,否则为false。

三:轮播图
 

1.首先确定焦点图样式:
 

<View style={styles.container}>
    <ScrollView
       ref="scrollView"
       horizontal={true}
       //隐藏水平滚动条
       showsHorizontalScrollIndicator={false} 
       //自动分页
       pagingEnabled={true}
       //当一帧滚动结束
       onMomentumScrollEnd={(e)=>this.onAnimatinonEnd(e)}
       //开始拖拽 
       onScrollBeginDrag = {()=>this.onScrollBeginDrag()}
       //停止拖拽
       onScrollEndDrag = {()=>this.onScrollEndDrag()}
       > 
       {this.renderAllImage()}
   </ScrollView>  
   {/*返回指示器 */}
   <View style={styles.pageViewStyle}>
       {this.renderPageCicle()}
   </View>
</View>

二:然后展示图片

  注意图片地址目录:F:\wamp\www\07react JS\01\Hello\android\app\src\main\res\drawable,其中drawable是我自己创建的,里面的图片不能用数组开头,不能随意修改图片的后缀名(也就是不要把jpg格式改为png格式),否则编译的时候android报错。
 

    renderAllImage(){
        var allImage = [];
        //拿到图像数组
        var imgsArr = ImageData.data; 
        // console.log(imgsArr);
        for(var i=0; i<imgsArr.length; i++){
            // 去出单独的每个对象
            var imgItem = imgsArr[i];
            //创建组件装入数组
            allImage.push(  
                <Image key={i} source={{uri:imgItem.img}}  style={styles.focusImage} />
            )
        }
        return allImage;
    };

三:显示下面的五个小圆点
 

    renderPageCicle(){
        var indicatorArr = [];
        var ImgsArr = ImageData.data;
        var styleChange;
        for(var i=0; i<ImgsArr.length; i++){
            //把原点装入数组
            styleChange = (i==this.state.currentPage ? styles.circleStyle : styles.circleDefaultStyle)
            indicatorArr.push(
                <Text key={i} style={styleChange}>
                    &bull;
                </Text>
            )
        }
        return indicatorArr;
    };

四:当滚动一帧的时候调用

 也就是可以找出滚动的索引

    onAnimatinonEnd(e){
        //1.水平方向上的偏移量
        var offSetX = e.nativeEvent.contentOffset.x;
        //2.求出当前页数
        var currentPage = Math.floor(offSetX / width);
        console.log(currentPage);
        //3.更新状态机,重新绘制ui
        this.setState({
            currentPage:currentPage
        })
    }

 五:开启定时器,自动滚动

  我们要处理手指滑动的时候和滑动停止的时候滚动效果。其中复杂的处理关系在componentDidMount函数里执行,因为 在调用了render方法后,组件加载成功并被成功渲染出来以后,所要执行的后续操作,一般会在这个函数中处理网络请求等加载数据的操作;因为UI已经成功被渲染出来, 所以放在这个函数里进行请求操作,不会出现UI上的错误。

componentDidMount(){
        //开启定时器
        this.startTimer()
    };
        //开始拖拽
    onScrollBeginDrag(){
        //停止定时器
        console.log('beginDrag');
        clearInterval(this.timer) 
    };
    onScrollEndDrag(){ 
        console.log('endDrag');
        this.startTimer();
    }; 
    //开启定时器
    startTimer(){
        //1.拿到scrollView 
        var scrollView = this.refs.scrollView;
        var imageCount = ImageData.data.length;
        //2.添加定时器
        this.timer = setInterval(()=>{
            //2.1设置原点
            var activePage = 0;
            //2.2判断
            if((this.state.currentPage+1) >= imageCount){
                activePage = 0;
            }else{
                activePage = this.state.currentPage+1;
            }
            //2.3更新状态机
            this.setState({ 
                currentPage : activePage,
            }) 
            //2.4scrollView滚动起来
            var offsetX = activePage * width;
            scrollView.scrollResponderScrollTo({x:offsetX,y:0,animated:true});
        },this.props.duration); 
    };

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值