最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

ReactNative之ScrollView轮播图实现方法实例

来源:动视网 责编:小采 时间:2020-11-27 15:08:13
文档

ReactNative之ScrollView轮播图实现方法实例

ReactNative之ScrollView轮播图实现方法实例:1.index.Android.js import React, { Component } from 'react'; import { AppRegistry, StyleSheet, TextInput, TouchableOpacity, ScrollView, Text, View } from 'react-native'; import ScrollViewDemo from "./scrollViewDemo"
推荐度:
导读ReactNative之ScrollView轮播图实现方法实例:1.index.Android.js import React, { Component } from 'react'; import { AppRegistry, StyleSheet, TextInput, TouchableOpacity, ScrollView, Text, View } from 'react-native'; import ScrollViewDemo from "./scrollViewDemo"
 1.index.Android.js

import React, { Component } from 'react'; 
import { 
 AppRegistry, 
 StyleSheet, 
 TextInput, 
 TouchableOpacity, 
 ScrollView, 
 Text, 
 View 
} from 'react-native'; 
 
import ScrollViewDemo from "./scrollViewDemo"; 
import ScrollViewTop from "./scrollViewTop"; 
import PositionDemo from "./positionDemo"; 
 
export default class CQQLoginDemo extends Component { 
 
 render() { 
 return ( 
 <ScrollViewTop/> 
 ); 
 } 
 
} 
AppRegistry.registerComponent('CQQLoginDemo', () => CQQLoginDemo);

2.在项目的 index.android.js同一目录下 创建json文件 这样方便图片的访问,资源图片放在项目名称\android\app\src\main\res\drawable 下面

这里的BadgeData.json 如下:

{ 
 "data":[ 
 { 
 "icon" : "danjianbao", 
 "title" : "单肩包" 
 }, 
 { 
 "icon" : "liantiaobao", 
 "title" : "链条包" 
 }, 
 { 
 "icon" : "qianbao", 
 "title" : "钱包" 
 }, 
 { 
 "icon" : "shoutibao", 
 "title" : "手提包" 
 }, 
 { 
 "icon" : "shuangjianbao", 
 "title" : "双肩包" 
 }, 
 { 
 "icon" : "xiekuabao", 
 "title" : "斜挎包" 
 } 
 ] 
}

3.主要的文件 scrollViewTop.js 文件 如下 具体注释中已写 直接上代码:

/** 
 * Sample React Native App 
 * 
 * @flow 
 */ 
 
import React, { Component } from 'react'; 
import { 
 AppRegistry, 
 StyleSheet, 
 ScrollView, 
 Image, 
 Text, 
 View 
} from 'react-native'; 
 
let Dimensions = require('Dimensions'); 
let ScreenWidth = Dimensions.get('window').width; 
let ScreenHeight = Dimensions.get('window').height; 
 
import ImageData from "./BadgeData.json"; 
 
export default class scrollViewTop extends Component { 
 
 constructor(props) { 
 super(props); 
 this.state = { currentPage: 0 }; 
 } 
 
 static defaultProps = { 
 duration: 1000, 
 } 
 
 componentDidMount() { 
 this._startTimer(); 
 
 } 
 
 componentWillUnmount() { 
 // 如果存在this.timer,则使用clearTimeout清空。 
 // 如果你使用多个timer,那么用多个变量,或者用个数组来保存引用,然后逐个clear this.timer && clearTimeout(this.timer); 
 } 
 
 render() { 
 return ( 
 <View style={styles.continer}> 
 <ScrollView 
 ref='scrollView' 
 //水平方向 horizontal={true} 
 //当值为true时显示滚动条 showsHorizontalScrollIndicator={false} 
 //当值为true时,滚动条会停在滚动视图的尺寸的整数倍位置。这个可以用在水平分页上 pagingEnabled={true} 
 //滑动完一贞 onMomentumScrollEnd={(e)=>{this._onAnimationEnd(e)}} 
 //开始拖拽 onScrollBeginDrag={()=>{this._onScrollBeginDrag()}} 
 //结束拖拽 onScrollEndDrag={()=>{this._onScrollEndDrag()}} 
 > 
 {this._renderAllImage()} 
 </ScrollView> 
 <View style={styles.pageViewStyle}> 
 {this._renderAllIndicator()} 
 </View> 
 </View> 
 ); 
 } 
 /**开始拖拽 */ 
 _onScrollBeginDrag(){ 
 console.log("开始拖拽"); 
 //两种清除方式 都是可以的没有区别 
 // this.timer && clearInterval(this.timer); this.timer && clearTimeout(this.timer); 
 } 
 /**停止拖拽 */ 
 _onScrollEndDrag(){ 
 console.log("停止拖拽"); 
 this.timer &&this._startTimer(); 
 } 
 
 /**1.轮播图片展示 */ 
 _renderAllImage() { 
 let allImage = []; 
 let imgsArr = ImageData.data; 
 for (let i = 0; i < imgsArr.length; i++) { 
 let imgsItem = imgsArr[i]; 
 allImage.push( 
 <Image key={i} source={{uri:imgsItem.icon}} style={styles.imageStyle} /> 
 ); 
 } 
 return allImage; 
 } 
 
 /**2.手动滑动分页实现 */ 
 _onAnimationEnd(e) { 
 //求出偏移量 let offsetX = e.nativeEvent.contentOffset.x; 
 //求出当前页数 let pageIndex = Math.floor(offsetX / ScreenWidth); 
 //更改状态机 this.setState({ currentPage: pageIndex }); 
 } 
 
 /**3.页面指针实现 */ 
 _renderAllIndicator() { 
 let indicatorArr = []; 
 let style; 
 let imgsArr = ImageData.data; 
 for (let i = 0; i < imgsArr.length; i++) { 
 //判断 style = (i==this.state.currentPage)?{color:'orange'}:{color:'white'}; 
 indicatorArr.push( 
 <Text key={i} style={[{fontSize:30},style]}> 
 ? 
 </Text> 
 ); 
 } 
 return indicatorArr; 
 } 
 
 /**4.通过定时器实现自动播放轮播图 */ 
 _startTimer(){ 
 let scrollView = this.refs.scrollView; 
 this.timer = setInterval( 
 ()=>{console.log('开启定时器'); 
 let imageCount = ImageData.data.length; 
 //4.1 设置圆点 let activePage = 0; 
 //4.2判断 if(this.state.currentPage>=imageCount+1){ 
 activePage = 0; 
 }else{ 
 activePage = this.state.currentPage+1; 
 } 
 //4.3 更新状态机 this.setState({currentPage:activePage}); 
 //4.4 让scrollview 滚动起来 let offsetX = activePage * ScreenWidth; 
 scrollView.scrollResponderScrollTo({x:offsetX,y:0,animated:true}); 
 }, 
 this.props.duration 
 ); 
 } 
} 
 const styles = StyleSheet.create({ 
 continer:{ 
 backgroundColor: '#dddddd' 
 }, 
 imageStyle:{ 
 height:400, 
 width:ScreenWidth 
 }, 
 pageViewStyle:{ 
 height:25, 
 width:ScreenWidth, 
 backgroundColor:'rgba(0,0,0,0.4)', 
 position:'absolute', 
 bottom:0, 
 
 flexDirection:'row', 
 alignItems:'center', 
 } 
});

文档

ReactNative之ScrollView轮播图实现方法实例

ReactNative之ScrollView轮播图实现方法实例:1.index.Android.js import React, { Component } from 'react'; import { AppRegistry, StyleSheet, TextInput, TouchableOpacity, ScrollView, Text, View } from 'react-native'; import ScrollViewDemo from "./scrollViewDemo"
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top