定制化你的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.pswp.cn/news/449534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449534.shtml
英文地址,請注明出處:http://en.pswp.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;切換到 性能…