自定义Banner组件

ScrollView组件

一个包装了平台的ScrollView(滚动视图)的组件,同时还集成了触摸锁定的“响应者”系统。

  • ScrollView必须有一个确定的高度才能正常工作
    它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作)。
    通常有两种做法:
    第一种: 直接给该ScrollView进行设置高度(不建议);
    第二种: ScrollView中不要加{flex:1}。
  • ScrollView内部的其他响应者尚无法阻止ScrollView本身成为响应者
常用属性
  • contentContainerStyle StyleSheetPropType(ViewStylePropTypes)
    这些样式会应用到一个内层的内容容器上,所有的子视图都会包裹在内容容器内。
  • horizontal bool
    当此属性为true的时候,所有的的子视图会在水平方向上排成一行,而不是默认的在垂直方向上排成一列。默认值为false。
  • OnMomentumScrollEnd function
    当一帧滚动完毕的时候调用,e.nativeEvent.contentOffset。
  • onScrollBeginDrag fuction
    当开始手动拖拽的时候调用。
  • onScrollEndDrag fuction
    当结束手动拖拽的时候调用。
  • showsHorizontalScrollIndicator bool
    当此属性为true的时候,显示一个水平方向的滚动条。
  • showsVerticalScrollIndicator bool
    当此属性为true的时候,显示一个垂直方向的滚动条。
  • onScroll function
    在滚动的过程中,每帧最多调用一次此回调函数。调用的频率可以用scrollEventThrottle属性来控制。
用ScrollView实现一个Banner广告

先导入计时器类库
npm i react-timer-mixin --save
在项目中需要引入并注册:
引入: var TimerMixin = require('react-timer-mixin');
注册:mixins: [TimerMixin]
具体代码实现:

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

var Dimensions = require('Dimensions');
var {width} = Dimensions.get('window');

// 引入计时器类库
var TimerMixin = require('react-timer-mixin');

// 引入json数据
var ImageData = require('./ImageData.json');


var App = React.createClass({

    // 注册计时器
    mixins: [TimerMixin],

    // 设置固定值
    getDefaultProps(){
        return{
            // 每隔多少时间
            duration: 1000
        }
    },

    // 设置可变的和初始值
    getInitialState(){
        return{
            // 当前的页码
            currentPage: 0
        }
    },

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

    // 调用开始拖拽
    onScrollBeginDrag(){
        // 停止定时器
        this.clearInterval(this.timer);
    },

    // 调用停止拖拽
    onScrollEndDrag(){
        // 开启定时器
        this.startTimer();
    },

    // 实现一些复杂的操作
    componentDidMount(){
        // 开启定时器
        this.startTimer();
    },

    // 开启定时器
    startTimer(){
        // 1. 拿到scrollView
        var scrollView = this.refs.scrollView;
        var imgCount = ImageData.data.length;

        // 2.添加定时器  this.timer --->可以理解成一个隐式的全局变量
        this.timer = this.setInterval(function () {
            // 2.1 设置圆点
            var activePage = 0;
            // 2.2 判断
            if((this.state.currentPage+1) >= imgCount){ // 越界
                activePage = 0;
            }else{
                activePage = this.state.currentPage+1;
            }

            // 2.3 更新状态机
            this.setState({
                currentPage: activePage
            });

            // 2.4 让scrollView滚动起来
            var offsetX = activePage * width;
            scrollView.scrollResponderScrollTo({x:offsetX, y:0, animated:true});

        }, this.props.duration);

    },


    // 返回所有的图片
    renderAllImage(){
        // 数组
        var allImage = [];
        // 拿到图像数组
        var imgsArr = ImageData.data;
        // 遍历
        for(var i=0; i<imgsArr.length; i++){
            // 取出单独的每一个对象
            var imgItem = imgsArr[i];
            // 创建组件装入数组
            allImage.push(
                <Image key={i} source={require('./image/img_01.png')} style={{width:width, height:120}}/>
            );
        }
        // 返回数组
        return allImage;
    },

    // 返回所有的圆点
    renderPageCircle(){
        // 定义一个数组放置所有的圆点
        var indicatorArr = [];
        var style;
        // 拿到图像数组
        var imgsArr = ImageData.data;
        // 遍历
        for(var i=0; i<imgsArr.length; i++){

            // 判断
            style = (i==this.state.currentPage) ? {color:'orange'} : {color:'#ffffff'};

            // 把圆点装入数组
            indicatorArr.push(
                <Text key={i} style={[{fontSize:25},style]}>&bull;</Text>
            );
        }
        // 返回
        return indicatorArr;
    },

    //  当一帧滚动结束的时候调用
    onAnimationEnd(e){
        // 1.求出水平方向的偏移量
        var offSetX = e.nativeEvent.contentOffset.x;

        // 2.求出当前的页数
        var currentPage = Math.floor(offSetX / width);
        // console.log(currentPage);

        // 3.更新状态机,重新绘制UI
        this.setState({
            // 当前的页码
            currentPage: currentPage
        });
    }

});


const styles = StyleSheet.create({
    container:{
        marginTop:25
    },

    pageViewStyle:{
        width:width,
        height:25,
        backgroundColor:'rgba(0,0,0,0.4)',

        // 定位
        position:'absolute',
        bottom:0,

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

推荐阅读更多精彩内容