ReactNative banner轮播控件的实现

  • 准备:
    react-native init banner
    cd xxxxx/banner
    react-native run-android

在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实现。
代码说明:

  • horizontal属性控制ScrollView的滚动方向
  • pagingEnable 控制ScrollViewm每次滚动是否滚动一个子控件的距离,为true,则和Android的ViewPager的效果一致,每次滚动一页,为false,则为普通的ScrollView的效果。


    1.gif

绘制圆点:

//绘制圆点
    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'
    }

})
  • 首先绘制圆点是用html的特殊文字代替,html的特殊字符编码对照表:http://www.jb51.net/onlineread/htmlchar.htm,里面的圆对应的编码为"bull;"
  • 其次,圆点的绝对布局,当最外层布局container的flexDirection:'column'的时候是相当于Android的LinearLayout的布局一样,不会悬浮在图片之上,必须制定其position:'absolute'为绝对布局,意思是相对父容器的绝对位置,bottom:0,将其设置在底部,这样才大功告成。


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

要点:

  • 在react组件里面如果有多个属性对象,则用数组表示,后面的属性则会覆盖前面的属性

  • ScrollView的onScroll回调方法:
    在滚动的过程中,每帧最多调用一次此回调函数。调用的频率可以用scrollEventThrottle属性来控制。我们可以利用这个回调来计算当前滑到了第几页从而改变圆点的位置。

<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>
        })
    }

  • onScroll回调函数中会传入一个事件的参数e,e.nativeEvent.contentOffset.x表示当前滑动了多少像素,因此可以计算出当前是滑到第几页,从而改变state,重绘圆点。
  • 还可以利用onMomentumScrollBegin属性来完成,这里相当于viewpager的onPageSelected,而onScroll相当于onPageScroll();

自动滚动

自动滚动需要一个定时器,再通过调用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)

    }
  • 最后呢,处理定时器于手动滑动的冲突
    ScrollView的开始拖拽和停止拖拽会回调onScrollBeginDrag、onScrollEndDrag的属性的传值方法,可以在里面控制停止定时器和开启定时器
onScrollBeginDrag={this.handleScrollBegin}
onScrollEndDrag={this.handleScrollEnd}

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

    //停止拖拽
    handleScrollEnd=()=> {
        this.startTimer();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,242评论 5 461
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,138评论 2 372
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,412评论 0 323
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,380评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,221评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,203评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,607评论 3 384
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,292评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,581评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,650评论 2 311
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,405评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,268评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,646评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,942评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,226评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,601评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,795评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,095评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,949评论 4 60
  • 什么是brunch?其实就是在早餐之后午餐之前的餐食,简言之,早午餐。书中很多人都热爱着早午餐,他们把对食物的热爱...
    墨紫七阅读 533评论 0 0
  • 姝!岁岁东风恨似初,黄花又,心字美人书。 注:词林正韵•四部(平) ——2016.6.1
    素月离竹阅读 217评论 0 0
  • 今天,终于,把上网的事情搞定了。可能是日本这边的惯例?来之前要先各种严格审查,但是一旦取得许可就一路绿灯。理学系研...
    GSES94阅读 185评论 0 0