定制化你的ReactNative底部导航栏

前言

​ 接触过ReactNative(以下简称RN)的大概都知道,react-navigation提供了两种开箱即用的导航栏组件

  • createBottomTabNavigator
  • createMaterialBottomTabNavigator

分别是这样的

尽管官方提供了导航栏的开箱即用方案,但是实际开发里面,我们会遇到各种各样的导航栏,各种各样的动效,所以以上可能无法满足我们的开发需求,我们就需要定制化的去做我们导航栏

例如我们UI给我的导航栏样式

我的内心: 这他么中间凸起的我怎么做,老子只是一个小前端,app很渣啊啊啊

借助可爱的google,我找到了解决方法

就是

TabBarComponent

这个api在文档资料很少,所以想要知道怎么用只能通过网络上的资源了

其中深受这篇文案的启发

Let's Create A Custom Animated Tab Bar With React Native

这位外国友人(话说reactnative在国外似乎还有点火),借助动画库react-native-pose,完成了这样的效果

虽然是英文博客,但是配合翻译基本阅读无障碍,借助他的博客,我完成了ReactNative的自定义导航栏,效果如下

自定义底部导航栏

  1. 自定义底部导航栏是基于createBottomTabNavigator,所以我们使用这个api来创建底部导航栏
  2. 指定createBottomTabNavigator的tabBarComponent
  3. tabBarComponent内部进行底部导航栏的编写

增加底部导航器

import React from 'react'
import { createBottomTabNavigator } from 'react-navigation'
import Icon from '../Common/Icon' // 自定义图标库
import TabBar from '../Common/TabBar' // tabBarComponent 自定义组件
// 页面
import Category from '../View/TabBar/Category/Category'
import Main from '../View/TabBar/Main/Main'
import My from '../View/TabBar/My/My'
import OrderList from '../View/TabBar/OrderList/OrderList'
import OnlineDoctor from '../View/TabBar/OnlineDoctor/OnlineDoctor'
export default createBottomTabNavigator({// 首页:one: {screen: Main,navigationOptions: () => {return {tabBarIcon: ({ tintColor }) => {var soureImgeif (tintColor == '#CBCBCB') {soureImge = 'main'} else {soureImge = 'mainActive'}return <Icon name={soureImge} size={26} color={tintColor} />}}}},//分类:two: {screen: Category,navigationOptions: {tabBarIcon: ({ tintColor }) => {var soureImgeif (tintColor == '#CBCBCB') {soureImge = 'Category'} else {soureImge = 'CategoryActive'}return <Icon name={soureImge} size={26} color={tintColor} />}}},//问诊:three: {screen: OnlineDoctor,navigationOptions: {tabBarIcon: ({ tintColor }) => {var soureImgeif (tintColor == '#CBCBCB') {soureImge = 'onLine'} else {soureImge = 'onLineActive'}return <Icon name={soureImge} size={48} color={tintColor} />}}},// 购物篮: four: {screen: OrderList,navigationOptions: {tabBarIcon: ({ tintColor }) => {var soureImgeif (tintColor == '#CBCBCB') {soureImge = 'OrderList'} else {soureImge = 'OrderListActive'}return <Icon name={soureImge} size={26} color={tintColor} />}}},//我的:five: {screen: My,navigationOptions: () => {return {tabBarIcon: ({ tintColor }) => {var soureImgeif (tintColor == '#CBCBCB') {soureImge = 'My'} else {soureImge = 'MyActive'}return <Icon name={soureImge} size={26} color={tintColor} />}}}}},{initialRouteName: 'one', // 初始化页面tabBarComponent: TabBar,tabBarOptions: {activeTintColor: '#F34C56',inactiveTintColor: '#CBCBCB'}}
)复制代码

工具函数

图标没有使用图标库,直接搞一个图标库比较得心应手

../Common/Icon.js

import React from 'react'
import { Image } from 'react-native'
import { TabIcon } from './Image'const Icon = ({ name, style, size }) => {const icon = TabIcon[name]return (<Imagesource={icon}style={[{ width: size, height: size }, style]}/>)
}export default Icon
复制代码

而对于图片则进行统一管理

../Common/Image.js

/*** 所有的图片资源都从这里统一管理*/
// 底部导航栏的图片资源
export const TabIcon = {main: require('..'),mainActive: require('..'),Category: require('..'),CategoryActive: require('..'),onLine: require('..'),onLineActive: require('..'),OrderList: require('..'),OrderListActive: require('..'),My: require('..'),MyActive: require('..'),
}
复制代码

自定义底部导航器

万事俱备,下面就是自定义底部导航器了,就和定义React组件一样

import React from 'react'
import {View,Text,StyleSheet,TouchableOpacity,TouchableNativeFeedback,Dimensions
} from 'react-native'
import posed from 'react-native-pose' // react-native 动画库const Scaler = posed.View({ // 定义点击缩放active: { scale: 1 },inactive: { scale: 0.9 }
})const TabBar = props => {const {renderIcon,getLabelText,activeTintColor,inactiveTintColor,onTabPress,onTabLongPress,getAccessibilityLabel,navigation} = propsconst { routes, index: activeRouteIndex } = navigation.statereturn (<Scaler style={Styles.container}>{routes.map((route, routeIndex) => {const isRouteActive = routeIndex === activeRouteIndexconst tintColor = isRouteActive ? activeTintColor : inactiveTintColorreturn (<TouchableNativeFeedbackkey={routeIndex}style={Styles.tabButton}onPress={() => {onTabPress({ route })}}onLongPress={() => {onTabLongPress({ route })}}accessibilityLabel={getAccessibilityLabel({ route })}>{route.key == 'three' ? ( // 对特殊图标进行特殊处理<Scalerstyle={Styles.scalerOnline}pose={isRouteActive ? 'active' : 'inactive'}>{renderIcon({ route, focused: isRouteActive, tintColor })}<Text style={Styles.iconText}>{getLabelText({ route })}</Text></Scaler>) : ( // 普通图标普通处理<Scalerstyle={Styles.scaler}pose={isRouteActive ? 'active' : 'inactive'}>{renderIcon({ route, focused: isRouteActive, tintColor })}<Text style={Styles.iconText}>{getLabelText({ route })}</Text></Scaler>)}</TouchableNativeFeedback>)})}</Scaler>)
}const Styles = StyleSheet.create({container: {flexDirection: 'row',height: 53,borderWidth: 1,borderRadius: 1,borderColor: '#EEEEEE',shadowOffset: { width: 5, height: 10 },shadowOpacity: 0.75,elevation: 1},tabButton: {flex: 1,justifyContent: 'center',alignItems: 'center'},spotLight: {width: tabWidth,height: '100%',justifyContent: 'center',alignItems: 'center'},spotLightInner: {width: 48,height: 48,backgroundColor: '#ee0000',borderRadius: 24},scaler: {flex: 1,alignItems: 'center',justifyContent: 'center',},scalerOnline: {flex: 1,alignItems: 'center',justifyContent: 'flex-end',},iconText: {fontSize: 12,lineHeight: 20}
})export default TabBar
复制代码

最后实现的效果就是

如果你也有这样的需求,可以看看老外发布的那篇博客

Let's Create A Custom Animated Tab Bar With React Native

最后: 快要过年了,祝大家新年快乐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

backtrader入坑1

烦死我了&#xff0c;不想玩backtrader&#xff0c;因为它只是个回测框架&#xff0c;数据库&#xff0c;下单界面和国内都不能有效对接&#xff0c;早期就是玩玩&#xff0c;图个乐子。还有学习它的代码编写逻辑&#xff0c;大概玩通了以后&#xff0c;完全不想碰它。感觉现在…

PHP 处理金额

导语 涉及到金额的代码&#xff0c;一定要谨慎处理。刚好最近做了相关的功能&#xff0c;下面大概说一下。 存储 PHP 的浮点数是不能精确计算的&#xff0c;具体的可以看这篇文章。所幸的是&#xff0c;金额一般不会有太多的小数。那么存储的时候呢&#xff0c;一言以蔽之&…

HEVC/H265 HM10.0 分析(三)TAppDecTop.cpp

在TAppDecTop.cpp ,最重要的是decode 函数&#xff0c;下面将对其进行分析&#xff0c;是解码上层的一个重要函数。 代码如下&#xff0c;代码后将进行分析。 Void TAppDecTop::decode() {Int poc;TComList<TComPic*>* pcListPic NULL;ifstream bits…

windows下xmllib2使用简介 64位

1&#xff1a;环境配置 包含目录下 包含include libxml2_64\include     包含xmllib库路径  libxml2_64 注意 libxml分为32位程序和64位程序&#xff0c;这两种的环境需要的lib不一样&#xff0c;需要分别下载 需要使用库 libxml2.lib 注意&#xff1a…

backtrader2

backtrader的基本策略构成&#xff1a; #构成 #Backtrader 回测代码编写流程如下&#xff1a; import backtrader as bt # 导入 Backtrader import backtrader.indicators as btind # 导入策略分析模块 import backtrader.feeds as btfeeds # 导入数据模块# 创建策略 class T…

解决浏览器 Provisional headers are shown 无法向后台发送请求问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的情况和下面情况一样&#xff0c;有一个断点。 今天调试项目BUG&#xff0c;页面的一个按钮点击后页面无反应&#xff0c;去后台找对…

台湾邮政历史常设展重新开幕

1月29日&#xff0c;重新开幕的台湾邮政历史常设展增加了与观众的对话和互动&#xff0c;希望吸引不同年龄层观众。中新社记者 孔任远 摄 1月29日&#xff0c;重新开幕的台湾邮政历史常设展增加了与观众的对话和互动&#xff0c;希望吸引不同年龄层观众。中新社记者 孔任远 摄 …

如何用vc6编译ffmpeg, 并单步调试。

如何用vc6编译ffmpeg, 并单步调试。目前官方ffmpeg的最新版本为0.9, 我们就以此为例&#xff1a; 1. 下载最新git版本的源代码(http://ffmpeg.zeranoe.com/builds/, 本例下载的是2011-12-12版本) 2. 放到MSYS环境里配置&#xff0c;生成config.h文件。mingw gcc是能顺利编译…

backtrader指标

添加分析指标 # 添加分析指标 # 返回年初至年末的年度收益率 cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name_AnnualReturn) # 计算最大回撤相关指标 cerebro.addanalyzer(bt.analyzers.DrawDown, _name_DrawDown) # 计算年化收益&#xff1a;日度收益 cerebro.addana…

Javascript DOM对属性的操作

获得属性值 itnode . 属性名称          //只能操作w3c规定内容 itnode . getAttribute(属性名称)    //规定的 和 自定义的都可以获取 设置属性值 itnode . 属性名称 值        //只能操作w3c规定的属性 itnode . setAttribute(名称&#xff0c;值) …

172开头的IP不一定是局域网的地址

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 A类 10.0.0.0-10.255.255.255 网络数&#xff1a;1B类 172.16.0.0-172.31.255.255 网络数&#xff1a;16C类 192.168.0.0-192.168.255.…

微信屏蔽百度红包活动页面,谁在焦虑?

1月29日消息&#xff0c;百度与中央电视台合作的百度红包链接分享页面被微信屏蔽&#xff0c;打开相关页面显示&#xff1a;网页包含诱导分享、关注等诱导行为内容&#xff0c;被多人投诉&#xff0c;为维护绿色上网环境&#xff0c;已经停止访问该网页。 雷锋网了解到&#x…

Visual C++利用Intel C++ 编译器提升多核性能与多媒体指令支持获取更高的程序效率与缩小程序体积

Intel c编译器有下列优点&#xff0c;建议VC项目开发采用intel c编译器取代VS自带c编译器&#xff1a; 与 Microsoft Visual C 相兼容&#xff0c;可以嵌入 Microsoft Visual Studio 开发环境。 支持最新的多核处理器&#xff0c;并提供安全功能&#xff0c;可以通过执行堆栈…

Backtrader交易基础

查看账户情况&#xff1a; class TestStrategy(bt.Strategy):def next(self):print(当前可用资金, self.broker.getcash())print(当前总资产, self.broker.getvalue())print(当前持仓量, self.broker.getposition(self.data).size)print(当前持仓成本, self.broker.getpositio…

IP地址分类/IP地址10开头和172开头和192开头的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 IP地址分类/IP地址10开头和172开头和192开头的区别/判断是否同一网段 简单来说在公司或企业内部看到的就基本都是内网IP&#xff0c;AB…

Redis数据结构之简单动态字符串SDS

Redis的底层数据结构非常多&#xff0c;其中包括SDS、ZipList、SkipList、LinkedList、HashTable、Intset等。如果你对Redis的理解还只停留在get、set的水平的话&#xff0c;是远远不足以应对面试提问的。本文简单介绍了Redis底层最重要的数据结构 - 简单动态字符串&#xff08…

Centos7 安装OpenTSDB

Centos7 安装OpenTSDB https://www.imzcy.cn/1697.html转载于:https://www.cnblogs.com/RHadoop-Hive/p/10563385.html

职场潜规则冷思考:别让老板“杀”了你

一位3年前共事过的同事走了&#xff0c;就在他以200多万的房贷代价拿到大门钥匙的时候&#xff0c;猝然倒在新房的楼梯上。另一个曾经在同一战壕里冲锋陷阵的同事被老板辞掉了&#xff0c;兢兢业业&#xff0c;起早贪黑&#xff0c;竟然没有熬过35岁下岗这一关&#xff0c;这时…

Backtrader交易基础2

成交价格确定&#xff1a; Order.Market 市价单&#xff0c;以当时市场价格成交的订单&#xff0c;不需要自己设定价格。市价单能被快速达成交易&#xff0c;防止踏空&#xff0c;尽快止损/止盈&#xff1b; 按下一个 Bar &#xff08;即生成订单的那个交易日的下一个交易日&…

windows 小技巧

2019独角兽企业重金招聘Python工程师标准>>> 桌面图标显示不全、图标呈现白色方块 ie4uinit -show 关闭占用指定端口的进程 获取进程: netstat -ano | findstr 端口号关闭进程&#xff1a;taskkill -f -pid 进程号文件被占用 打开任务管理器&#xff0c;切换到 性能…