ReactNative的ViewPagerAndroid简述

前端之家收集整理的这篇文章主要介绍了ReactNative的ViewPagerAndroid简述前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

ViewPager是Android中比较常见的页面切换控件,同时,在UIExplorerApp中也有ViewPagerAndroid的示例. 通过使用这个控件,理解ReactNative的实现逻辑. 我们现在来分析一下ViewPager的使用方式和ReactNative的编程要点,本文注释也很清晰.

效果

1. 准备

新建ReactNative的项目.

  1. npm install -g react-native-cli
  2. react-native init [TestViewPager]

-g是全局,react-native-cli是react-native的命令行工具(command line interface). 安装需要管理员权限(sudo),安装一次即可,使用react-native命令. 参考.

修改项目架构,主页直接跳转至ViewPager模块.

  1. 'use strict';
  2.  
  3. var React = require('react-native');
  4.  
  5. var {
  6. AppRegistry,} = React;
  7.  
  8. var ViewPagerModule = require('./ViewPagerModule/index')
  9.  
  10. AppRegistry.registerComponent('TestViewPager',() => ViewPagerModule);

2. 概述

ViewPager包含若干滑动页面; 点赞选项-模拟页面交互; 按键和滚动条-模拟滚动监听.

  1. 'use strict'
  2.  
  3. var React = require('react-native');
  4.  
  5. var {
  6. View,Text,Image,TouchableNativeFeedback,// 触碰响应
  7. TouchableOpacity,// 触碰更换透明度的属性
  8. ViewPagerAndroid,// Android的ViewPager
  9. } = React;
  10.  
  11. // Styles
  12. var styles = require('./style');
  13.  
  14. var PAGES = 5; // 页数
  15.  
  16. // 颜色
  17. var BGCOLOR = ['#8ad3da','#eecde2','#e682b4','#b7badd','#f1c7dd'];
  18.  
  19. // 本地图片地址
  20. var IMAGE_URIS = [
  21. require('./images/jessicajung.png'),require('./images/tiffany.png'),require('./images/SEOhyun.png'),require('./images/taeyeon.png'),require('./images/yoona.png'),];
  22.  
  23. // 名称
  24. var NAMES = ['Jessica','Tiffany','SEOhyun','Taeyeon','Yoona'];
  25.  
  26. /** * 点赞功能页面 * @param {likes: 点赞数} * @return {点赞视图} [点赞按钮,动态增加点赞数] */
  27. var LikeCount = React.createClass({
  28. // 初始化状态
  29. getInitialState: function() {
  30. return {
  31. likes: 0,};
  32. },// 点击增加
  33. onClick: function() {
  34. this.setState({likes: this.state.likes + 1});
  35. },render: function() {
  36. var thumbsUp = '\uD83D\uDC4D'; // 图标
  37. return (
  38. <View style = {styles.likeContainer}>
  39. <TouchableOpacity
  40. onPress={this.onClick}
  41. style={styles.likeButton}>
  42. <Text style={styles.likesText}>
  43. {thumbsUp}
  44. </Text>
  45. </TouchableOpacity>
  46. <Text style={styles.likesText}>
  47. {this.state.likes + ' 喜欢'}
  48. </Text>
  49. </View>
  50. );
  51. },});
  52.  
  53. /** * 按钮: 添加点击状态(enabled)和文本(text) * @param {enabled:点击状态} {text:显示文本} {onPress:点击事件} * @return {TouchableNativeFeedback} [触摸反馈的视图] */
  54. var Button = React.createClass({
  55. _handlePress: function() {
  56. if (this.props.enabled && this.props.onPress) {
  57. this.props.onPress();
  58. }
  59. },render: function() {
  60. return (
  61. <TouchableNativeFeedback onPress={this._handlePress}>
  62. <View style={[styles.button,this.props.enabled ? {} : styles.buttonDisabled]}>
  63. <Text style={styles.buttonText}>
  64. {this.props.text}
  65. </Text>
  66. </View>
  67. </TouchableNativeFeedback>
  68. );
  69. }
  70. });
  71.  
  72. /** * 滚动条,fractionalPosition滚动条长度,progressBarSize当前大小 * @param {size:滚动条大小} {progress:过程} * @return {View} [里外两层视图,背景白框黑底,显示白框] */
  73. var ProgressBar = React.createClass({
  74. render: function() {
  75. var fractionalPosition = (this.props.progress.position + this.props.progress.offset);
  76. var progressBarSize = (fractionalPosition / (PAGES - 1)) * this.props.size;
  77. return (
  78. <View style={[styles.progressBarContainer,{width: this.props.size}]}>
  79. <View style={[styles.progressBar,{width: progressBarSize}]}/>
  80. </View>
  81. );
  82. }
  83. });
  84.  
  85.  
  86. var ViewPagerModule = React.createClass({
  87.  
  88. /** * 初始化状态 * @return {状态} [页面] */
  89. getInitialState: function() {
  90. return {
  91. page: 0,// 当前位置
  92. progress: { // Progress位置
  93. position: 0,offset: 0,}
  94. };
  95. },// 页面选择
  96. onPageSelected: function(e) {
  97. this.setState({page: e.nativeEvent.position});
  98. },// 页面滚动
  99. onPageScroll: function(e) {
  100. this.setState({progress: e.nativeEvent});
  101. },// 移动页面
  102. move: function(delta) {
  103. var page = this.state.page + delta;
  104. this.go(page);
  105. },// @R_926_404@面
  106. go: function(page) {
  107. this.viewPage.setPage(page);
  108. this.setState({page});
  109. },render: function() {
  110. var pages = [];
  111.  
  112. for (var i=0; i<PAGES; i++) {
  113. // 背景
  114. var pageStyle = {
  115. backgroundColor: BGCOLOR[i % BGCOLOR.length],alignItems: 'center',padding: 20,}
  116.  
  117. pages.push(
  118. <View
  119. key={i}
  120. style={pageStyle}
  121. collapsable={false}>
  122. <Image
  123. style={styles.image}
  124. resizeMode={'cover'}
  125. source={IMAGE_URIS[i%PAGES]}
  126. />
  127. <Text style={styles.nameText}>
  128. {NAMES[i%PAGES]}
  129. </Text>
  130. <LikeCount />
  131. </View>
  132. );
  133. }
  134. var {page} = this.state;
  135.  
  136. return (
  137. <View style={styles.container}>
  138. <ViewPagerAndroid
  139. style={styles.viewPager}
  140. initialPage={0}
  141. onPageScroll={this.onPageScroll}
  142. onPageSelected={this.onPageSelected}
  143. ref={viewPager => {this.viewPage = viewPager;}}>
  144. {pages}
  145. </ViewPagerAndroid>
  146.  
  147. <View style={styles.buttons}>
  148. <Button
  149. text="首页"
  150. enabled={page > 0}
  151. onPress={() => this.go(0)}/>
  152. <Button
  153. text="上一页"
  154. enabled={page > 0}
  155. onPress={() => this.move(-1)}/>
  156. <Text style={styles.buttonText}>
  157. {page+1} / {PAGES}
  158. </Text>
  159. {/*进度条*/}
  160. <ProgressBar
  161. size={80}
  162. progress={this.state.progress}/>
  163. <Button
  164. text="下一页"
  165. enabled={page < PAGES - 1}
  166. onPress={() => this.move(1)}/>
  167. <Button
  168. text="尾页"
  169. enabled={page < PAGES - 1}
  170. onPress={() => this.go(PAGES -1)}/>
  171. </View>
  172. </View>
  173. );
  174. },});
  175.  
  176. module.exports = ViewPagerModule;

引入RN的原生模块

  1. var {
  2. View,// Android的ViewPager
  3. } = React;

TouchableNativeFeedback,接触时会受到原生的响应; TouchableWithoutFeedback,接触时无响应. TouchableOpacity,接触时会改变透明度. 在加入onclick方法时,可以模拟按钮视图.

定义控件: LikeCount点赞,Button按钮,ProgressBar滚动条.

3. 点赞(LikeCount)控件

likes存储喜欢的数量. 点击时,更新数量状态,刷新页面. 其中,喜欢按钮是触碰控件,在接触时会改变透明度(Opacity).

  1. /** * 点赞功能页面 * @param {likes: 点赞数} * @return {点赞视图} [点赞按钮,});

直接调用,即可使用.

  1. <LikeCount />

state的like属性,仅仅作用于当前页面,每次更新时刷新.
注意: 一定要谨慎使用全局state,这样会刷新整个页面,影响效率.

4. 按钮(Button)控件

添加使用状态,是否可以点击,根据状态修改视图样式和点击回调.

  1. /** * 按钮: 添加点击状态(enabled)和文本(text) * @param {enabled:点击状态} {text:显示文本} {onPress:点击事件} * @return {TouchableNativeFeedback} [触摸反馈的视图] */
  2. var Button = React.createClass({
  3. _handlePress: function() {
  4. if (this.props.enabled && this.props.onPress) {
  5. this.props.onPress();
  6. }
  7. },this.props.enabled ? {} : styles.buttonDisabled]}>
  8. <Text style={styles.buttonText}>
  9. {this.props.text}
  10. </Text>
  11. </View>
  12. </TouchableNativeFeedback>
  13. );
  14. }
  15. });

在RN中,并没有提供Button视图,可以使用Touchable类的视图,设置点击事件,如TouchableNativeFeedback,根据状态,修改按钮的样式和点击. 注意: props表示属性,在使用视图时提供.

使用Button,设置text显示,enabled状态,onPress点击事件.

  1. <Button
  2. text="首页"
  3. enabled={page > 0}
  4. onPress={() => this.go(0)}/>

5. 滚动条(ProgressBar)控件

主要监听ViewPager的滚动事件,这和Android的滚动非常类似,fractionalPosition是偏移比例,progressBarSize是偏移量.

  1. /** * 滚动条,{width: progressBarSize}]}/>
  2. </View>
  3. );
  4. }
  5. });

控件需要设置ProgressBar属性progress(滚动位置)和size(大小).

使用控件,属性: size大小; progress进度状态,其中position是位置,offset是偏移.

  1. progress: { // Progress位置
  2. position: 0,}
  3. ...
  4. <ProgressBar
  5. size={80}
  6. progress={this.state.progress}/>

注意: progress是主页面属性,重置状态时,刷新全部页面.

6. ViewPager页面

根据页面定制属性,根据页面ID设置不同图片文字.

  1. for (var i=0; i<PAGES; i++) { // 背景 var pageStyle = { backgroundColor: BGCOLOR[i % BGCOLOR.length],alignItems: 'center',padding: 20,} pages.push( <View key={i} style={pageStyle} collapsable={false}> <Image style={styles.image} resizeMode={'cover'} source={IMAGE_URIS[i%PAGES]} /> <Text style={styles.nameText}> {NAMES[i%PAGES]} </Text> <LikeCount /> </View> ); }

注意设置图片资源时,
使用IMAGE_URIS =['xxx.png']require(IMAGE_URIS[i%PAGES])显示模块丢失.
在数组IMAGE_URIS使用require('./images/jessicajung.png')加载source就可以.
思考很久的问题…

ViewPager页面

  1. <View style={styles.container}> <ViewPagerAndroid style={styles.viewPager} initialPage={0} onPageScroll={this.onPageScroll} onPageSelected={this.onPageSelected} ref={viewPager => {this.viewPage = viewPager;}}> {pages} </ViewPagerAndroid> <View style={styles.buttons}> <Button text="首页" enabled={page > 0} onPress={() => this.go(0)}/> <Button text="上一页" enabled={page > 0} onPress={() => this.move(-1)}/> <Text style={styles.buttonText}> 页 {page+1} / {PAGES} </Text> {/*进度条*/} <ProgressBar size={80} progress={this.state.progress}/> <Button text="下一页" enabled={page < PAGES - 1} onPress={() => this.move(1)}/> <Button text="尾页" enabled={page < PAGES - 1} onPress={() => this.go(PAGES -1)}/> </View> </View>

使用方法,监听ViewPagerAndroid的事件,onPageScroll页面滚动,onPageSelected页面选择,按钮关联页面. 核心在于go方法,设置stateviewPage页.

  1. // @R_926_404@面
  2. go: function(page) {
  3. this.viewPage.setPage(page);
  4. this.setState({page});
  5. },

7. Styles

引入styles,使用独立文件.

  1. // Styles
  2. var styles = require('./style');

样式

  1. 'use strict';
  2.  
  3. var React = require('react-native');
  4.  
  5. var {
  6. StyleSheet,} = React;
  7.  
  8. var styles = StyleSheet.create({
  9. buttons: {
  10. flexDirection: 'row',height: 40,backgroundColor: 'pink',justifyContent: 'space-between',},// 按钮可点击状态
  11. button: {
  12. flex: 1,width: 0,margin: 2,borderColor: 'gray',borderWidth: 1,backgroundColor: 'gray',// 按钮非点击装
  13. buttonDisabled: {
  14. backgroundColor: 'black',opacity: 0.5,buttonText: {
  15. fontSize: 12,color: 'white',textAlign: 'center',// 文字显示
  16. nameText: {
  17. fontSize: 16,margin: 4,container: {
  18. flex: 1,backgroundColor: 'white',image: {
  19. flex: 1,width: 300,likeButton: {
  20. backgroundColor: 'rgba(0,0.1)',borderColor: '#333333',borderRadius: 5,flex: 1,margin: 8,padding: 8,likeContainer: {
  21. flexDirection: 'row',likesText: {
  22. flex: 1,fontSize: 18,alignSelf: 'center',progressBarContainer: {
  23. height: 10,margin: 5,borderColor: '#eeeeee',borderWidth: 2,progressBar: {
  24. alignSelf: 'flex-start',backgroundColor: '#eeeeee',viewPager: {
  25. flex: 1,});
  26.  
  27. module.exports = styles;

里面包含各个控件的样式,主要使用了Flex+RN的Style.

动画效果

动画

Github下载地址

OK,通过实现简单的ViewPagerAndroid学习了很多知识.

猜你在找的React相关文章