欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

React Native学习教程之自定义NavigationBar详解

程序员文章站 2023-12-18 14:56:04
前言 在刚开始学习react native的时候,版本还是0.20,问题一大堆,navigation这个问题更是很多,首先,是navigationbar的问题,navig...

前言

在刚开始学习react native的时候,版本还是0.20,问题一大堆,navigation这个问题更是很多,首先,是navigationbar的问题,navigationios有navigationbar,navigation却需要自定义一个,最后,我想了想,还是自定义一个view,岂不更好,现在新公司不用rn,我正好有点时间,就把自定义的navigationbar分享给大家。好了少废话,上代码;

示例代码

// navigationbar 导航条的自定义封装 
// create by 小广 
'use strict'; 
import react, { component,proptypes } from 'react'; 
import { 
 image, 
 text, 
 view, 
 platform, 
 touchableopacity, 
} from 'react-native'; 
 
import styles from './navigationbarstyle' 
 
// 导航条和状态栏的高度 
const status_bar_height = 20 
const nav_bar_height = 44 
 
export default class navigationbar extends component { 
 static defaultprops = { 
 title: 'title', 
 titletextcolor: '#383838', 
 titleviewfunc () {}, 
 barbgcolor: '#f8f8f8', 
 baropacity: 1, 
 barstyle: 0, 
 barborderbottomcolor: '#d4d4d4', 
 barborderbottomwidth: 0.8, 
 statusbarshow: true, 
 leftitemtitle: '', 
 lefttextcolor: '#383838', 
 leftitemfunc () {}, 
 rightitemtitle: '', 
 righttextcolor: '#383838', 
 rightitemfunc () {}, 
 //leftimagesource: require('./nav_back.png'), 
 }; 
 static proptypes = { 
 title: proptypes.string,   // nav标题 
 titletextcolor: proptypes.string, // nav标题颜色 
 titleview: proptypes.node,  // nav自定义标题view(节点) 
 titleviewfunc: proptypes.func, // nav的titleview点击事件 
 barbgcolor: proptypes.string, // bar的背景颜色 
 baropacity: proptypes.number, // bar的透明度 
 barstyle: proptypes.number, // bar的扩展属性,nav样式(暂未使用) 
 barborderbottomcolor: proptypes.string, // bar底部线的颜色 
 barborderbottomwidth: proptypes.number, // bar底部线的宽度 
 statusbarshow: proptypes.bool,  // 是否显示状态栏的20高度(默认true) 
 leftitemtitle: proptypes.string, // 左按钮title 
 leftimagesource: proptypes.node, // 左item图片(source) 
 lefttextcolor: proptypes.string, // 左按钮标题颜色 
 leftitemfunc: proptypes.func,  // 左item事件 
 rightitemtitle: proptypes.string, // 右按钮title 
 rightimagesource: proptypes.node, // 右item图片(source) 
 righttextcolor: proptypes.string, // 右按钮标题颜色 
 rightitemfunc: proptypes.func,  // 右item事件 
 }; 
 
 render() { 
 // 判断左item的类型 
 var onlylefticon = false; // 是否只是图片 
 if (this.props.leftitemtitle && this.props.leftimagesource) { 
  onlylefticon = true; 
 } else if (this.props.leftimagesource) { 
  onlylefticon = true; 
 } 
 
 // 左侧图片title都没有的情况下 
 var noneleft = false; 
 if (!(this.props.leftitemtitle.length > 0) && !(this.props.leftimagesource)) { 
  noneleft = true; 
 } 
 
 // 判断是否自定义titleview 
 var hastitleview = false; 
 if (this.props.title && this.props.titleview) { 
  hastitleview = true; 
 } else if (this.props.titleview) { 
  hastitleview = true; 
 } 
 
 // 判断右item的类型 
 var onlyrighticon = false; // 是否只是图片 
 if (this.props.rightitemtitle && this.props.rightimagesource) { 
  onlyrighticon = true; 
 } else if (this.props.rightimagesource) { 
  onlyrighticon = true; 
 } 
 
 // 右侧图片title都没有的情况下 
 var noneright = false; 
 if (!(this.props.rightitemtitle.length > 0) && !(this.props.rightimagesource)) { 
  noneright = true; 
 } 
 
 // 判断是否显示20状态栏高度 
 let showstatusbar = this.props.statusbarshow; 
 if (platform.os === 'android') { 
  // 安卓不显示 
  showstatusbar = false; 
 } 
 return ( 
  <view style={styles.nav_barview}> 
  <view style={[styles.nav_bar, 
   { 
   backgroundcolor: this.props.barbgcolor, 
   height: showstatusbar ? nav_bar_height + status_bar_height : nav_bar_height, 
   opacity: this.props.baropacity 
   }, 
   showstatusbar ? { paddingtop: status_bar_height } : {}, this.props.barstyle]}> 
   <view style={styles.nav_itemview}> 
   { // 左侧item 
    !noneleft 
    ? <touchableopacity 
     style={styles.nav_leftitem} 
     onpress={this.props.leftitemfunc}> 
     { // 左侧是图片还是文字 
     onlylefticon 
     ? <image style={styles.nav_leftimage} 
        source={this.props.leftimagesource}/> 
     : <text style={[styles.nav_lefttitle,{color: this.props.lefttextcolor}]}> 
      {this.props.leftitemtitle} 
      </text> 
     } 
    </touchableopacity> 
    : null 
   } 
   </view> 
   { 
   hastitleview 
   ? <touchableopacity style={styles.nav_titleview} onpress={this.props.titleviewfunc}> 
    {this.props.titleview} 
    </touchableopacity> 
   : <view style={styles.nav_titleview}> 
    <text style={[styles.nav_title,{color:this.props.titletextcolor}]}> 
     {this.props.title} 
    </text> 
    </view> 
   } 
   <view style={styles.nav_itemview}> 
   { // 右侧item 
    !noneright 
    ? <touchableopacity 
     style={styles.nav_rightitem} 
     onpress={this.props.rightitemfunc}> 
     { // 右侧是图片还是文字 
     onlyrighticon 
     ? <image style={styles.nav_rightimage} 
        source={this.props.rightimagesource}/> 
     : <text style={[styles.nav_righttitle,{color: this.props.righttextcolor}]}> 
      {this.props.rightitemtitle} 
      </text> 
     } 
    </touchableopacity> 
    : null 
   } 
   </view> 
  </view> 
  <view style={{height:this.props.barborderbottomwidth,backgroundcolor:this.props.barborderbottomcolor}}></view> 
  </view> 
 
 ); 
 } 
} 

css样式:

// navigationbarstyle 导航条的样式 
// create by 小广 
'use strict'; 
import { 
 stylesheet, 
} from 'react-native'; 
 
export default stylesheet.create({ 
 // navbar 
 nav_barview:{ 
 justifycontent: 'center', 
 }, 
 nav_bar: { 
 //flex:1, 
 flex: 1, 
 flexdirection:'row', 
 justifycontent: 'center', 
 }, 
 
 // 标题纯title 
 nav_title: { 
 fontsize:17, 
 }, 
 
 // titleview 
 nav_titleview: { 
 flex: 1, 
 alignitems: 'center', 
 justifycontent: 'center', 
 }, 
 
 nav_itemview:{ 
 width:80, 
 justifycontent: 'center', 
 }, 
 
 // 左item 
 nav_leftitem: { 
 marginleft:8, 
 flex:1, 
 justifycontent: 'center', 
 alignself: 'flex-start', 
 //backgroundcolor:'#f00', 
 }, 
 
 // 左item为title 
 nav_lefttitle: { 
  marginright:5, 
  marginleft:5, 
  fontsize: 14, 
 }, 
 
 // 左图片 
 nav_leftimage: { 
  margin:10, 
  resizemode:'contain', 
 }, 
 
 // 右item 
 nav_rightitem: { 
  marginright:8, 
  flex:1, 
  justifycontent: 'center', 
  alignself: 'flex-end', 
  //backgroundcolor:'#3393f2', 
 }, 
 
 // 右item为title 
 nav_righttitle: { 
  marginright:5, 
  marginleft:5, 
  fontsize: 14, 
 }, 
 
 // 右图片 
 nav_rightimage:{ 
  margin:10, 
  resizemode:'contain', 
  //backgroundcolor:'#f00', 
 }, 
 //resizemode:'contain', 
}); 

用法:引入之后

import navigationbar from '你的存放路径/navigationbar.js'

class xgrndemo extends component { 
 
 _leftitemaction() { 
 console.log('左侧按钮点击了'); 
 } 
 
 _rightitemaction() { 
 console.log('右侧按钮点击了'); 
 } 
 
 render() { 
 return ( 
  <view style={styles.container}> 
  <navigationbar 
   title='这个是标题' 
   leftimagesource={require('./nav_back.png')} 
   rightitemtitle='按钮' 
   righttextcolor='#3393f2' 
   leftitemfunc={this._leftitemaction.bind(this)} 
   rightitemfunc={this._rightitemaction.bind(this)}/> 
  <scrollview style={styles.container} 
   automaticallyadjustcontentinsets={false} 
   keyboardshouldpersisttaps={true} 
   keyboarddismissmode='on-drag' 
   > 
   <text style={styles.welcome}> 
   welcome to react native! 
   </text> 
   <text style={styles.instructions}> 
   to get started, edit index.ios.js 
   </text> 
   <text style={styles.instructions}> 
   press cmd+r to reload,{'\n'} 
   cmd+d or shake for dev menu 
   </text> 
  </scrollview> 
  </view> 
 ); 
 } 
} 
 
const styles = stylesheet.create({ 
 container: { 
 flex: 1, 
 backgroundcolor: '#f5fcff', 
 }, 
 welcome: { 
 fontsize: 20, 
 textalign: 'center', 
 margin: 10, 
 }, 
 instructions: { 
 textalign: 'center', 
 color: '#333333', 
 marginbottom: 5, 
 }, 
}); 

其中可以自定义的属性

title: proptypes.string,   // nav标题 
titletextcolor: proptypes.string, // nav标题颜色 
titleview: proptypes.node,  // nav自定义标题view(节点) 
titleviewfunc: proptypes.func, // nav的titleview点击事件 
barbgcolor: proptypes.string, // bar的背景颜色 
baropacity: proptypes.number, // bar的透明度 
barstyle: proptypes.number, // bar的扩展属性,nav样式(暂未使用) 
barborderbottomcolor: proptypes.string, // bar底部线的颜色 
barborderbottomwidth: proptypes.number, // bar底部线的宽度 
statusbarshow: proptypes.bool,  // 是否显示状态栏的20高度(默认true) 
leftitemtitle: proptypes.string, // 左按钮title 
leftimagesource: proptypes.node, // 左item图片(source) 
lefttextcolor: proptypes.string, // 左按钮标题颜色 
leftitemfunc: proptypes.func,  // 左item事件 
rightitemtitle: proptypes.string, // 右按钮title 
rightimagesource: proptypes.node, // 右item图片(source) 
righttextcolor: proptypes.string, // 右按钮标题颜色 
rightitemfunc: proptypes.func,  // 右item事件 

效果如图:

React Native学习教程之自定义NavigationBar详解

ps:之前想上传到npm服务器,但是自己没搞成功,就这了吧..

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: