标签:
由于RN在Android平台上不支持gif格式的图片,今天介绍下我们是怎么处理这个问题的。
先来看看我们需要实现的效果,这是一张gif图片,当我们列表上拉加载下一页的时候需要使用这个效果,如下图:
我们的解决方案是:将gif切成15张png的图片,暂且命名为loading1、loading2.... loading15
然后循环的setState修改图片,就像看电影一样,达到动画的效果。
//图片数组 var loading_imgs = new Array(); //最大图片张数 const imageLength = 15; //动画使用的数组下标 const imageIndex = 0; constructor(props) { super(props); this.state = { dataSource: new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2,}), …. imageIndex:imageIndex, }; //组装图片数组 共15张图片 loading1 -> loading15 for( i=1;i<= imageLength;i++){ let loadingUri = "loading" + i; let img = <Image source={{uri:loadingUri}} key={i} style={{width:20,height:20}}/>; loading_imgs.push(img); } }
为什么要预加载?
刚开始我们做的时候,也没有预加载,只是在构造方法中定义了图片数组loading_imgs,但是在真机上看的时候,发现图片播放的时候第一次会很卡顿,这是因为图片加载到内存需要时间,当我们轮播图片的时候图片还没有加载完毕,在视觉上造成卡顿的效果。
我们是把图片数组初始化在屏幕外面(绝对定位),这种方式不太好。
render() { return ( <View style={styles.container}> <View style={{position:'absolute', top:-1000}}> { loading_imgs.map((item,i)=> loading_imgs[i]) } </View> </View> )};
定义图片轮播函数_loop
每隔100毫秒切换一张图片
当数据加载完毕,清楚定时任务,并且将图片置为第一张
图片轮播函数 _loop() { this.loopCount++; if (this.loopCount < loading_imgs.length) { this.setState({ imageIndex: this.loopCount, }); }else { this.loopCount = -1; } } //轮播图片 this.timerPic = setInterval(this._loop.bind(this), 100); //清除图片轮播效果 this.timer1 && clearInterval(this.timer1); this.loopCount = -1;
在我们做的过程中也发现了一个RN的组件ActivityIndicator的bug,
<ActivityIndicator animating={true} size="small" />
在meizu手机上,默认是绿色,设置为red时,效果正常。
在Android平台上,RN的坑不是一点点啊。
《React-Native系列》21、 解决RN在Android下不支持gif问题
标签:
原文地址:http://blog.csdn.net/codetomylaw/article/details/52280828