ReactNative banner轮播控件的实现

2017-05-02  本文已影响1074人  耳_总

在RN里面实现轮播广告banner滚动条主要是用ScrollView来实现,首先看下ScrollView的用法:

<ScrollView
       horizontal={true}
       pagingEnabled={true}
       showsHorizontalScrollIndicator={false}>
       {this.renderScrollView()}
</ScrollView>

renderScrollView = () => {
        return colors.map((item, i) => {
            return <Image key={item+i} style={styles.imageStyle} source={require('./image/img_01.png')}></Image>

        })
    }

这里引用了ScrollView,里面的子控件通过一个数组的map来获得,通常在我们的项目中banner的条目的个数是从服务器获取,根据返回的数据的列表的个数来知道banner滚动的个数,这里只是用color数组模拟了的数据,返回的是color数组长度的Image图片控件,作为最简单的banner实现。
代码说明:

绘制圆点:

//绘制圆点
    renderCircle = ()=> {
        return colors.map((item,i) => {
            return <Text key={`item${i}`} style={styles.circleStyle}>•</Text>
        })
    }

render() {

        return <View style={styles.container}>
            <ScrollView
                horizontal={true}
                pagingEnabled={true}
                showsHorizontalScrollIndicator={false}>
                {this.renderScrollView()}
            </ScrollView>

            <View style={styles.circleWrapperStyle}>
                {this.renderCircle()}
            </View>
        </View>
    }
var styles = StyleSheet.create({
    container :{
        flexDirection:'column'
    },

    imageStyle: {
        width: screenWidth,
        height: 140
    },
    circleStyle: {
        fontSize:20,
        color:'red'
    },

    circleWrapperStyle: {
        flexDirection:'row',
        bottom:0,
        left:10,
        position:'absolute'
    }

})
绘制不同颜色的点
//绘制圆点
    renderCircle = ()=> {
        return colors.map((item,i) => {
            var style = {};
            if(i === 0) {
                style = {color:'orange'};
            }
            return <Text key={`item${i}`} style={[styles.circleStyle,style]}>•</Text>
        })
    }

要点:

<ScrollView
                horizontal={true}
                pagingEnabled={true}
                onScroll={this.handleScroll}
                showsHorizontalScrollIndicator={false}>
                {this.renderScrollView()}
            </ScrollView>

handleScroll = (e)=> {
        var x = e.nativeEvent.contentOffset.x;
        if(x%screenWidth === 0) {
            this.setState({currentPage:x/screenWidth});
        }
    }

//绘制圆点
    renderCircle = ()=> {
        return colors.map((item,i) => {
            var style = {};
            if(i === this.state.currentPage) {
                style = {color:'orange'};
            }
            return <Text key={`item${i}`} style={[styles.circleStyle,style]}>•</Text>
        })
    }

自动滚动

自动滚动需要一个定时器,再通过调用ScrollView.scrollTo();方法来实现滚动
定时器在componentDidMount()里面启动。

startTimer = ()=>{
        setInterval(()=>{
            var currentPage = ++this.state.currentPage==4?0:this.state.currentPage
            this.refs.scrollview.scrollTo({x:currentPage*screenWidth,y:0,animated: true})
        },2000)

    }
onScrollBeginDrag={this.handleScrollBegin}
onScrollEndDrag={this.handleScrollEnd}

//开始拖拽
    handleScrollBegin=()=> {
        clearInterval(this.timmer)
    }

    //停止拖拽
    handleScrollEnd=()=> {
        this.startTimer();
    }
上一篇下一篇

猜你喜欢

热点阅读