Expo大作戰(十二)--expo中的自定義樣式Custom font,以及expo中的路由RouteNavigation

?

?

簡要:本系列文章講會對expo進行全面的介紹,本人從2017年6月份接觸expo以來,對expo的研究斷斷續續,一路走來將近10個月,廢話不多說,接下來你看到內容,講全部來與官網

我猜去全部機翻+個人修改補充+demo測試的形式,對expo進行一次大補血!歡迎加入expo興趣學習交流群:597732981

【之前我寫過一些列關于expo和rn入門配置的東i西,大家可以點擊這里查看:從零學習rn開發】

相關文章:

Expo大作戰(一)--什么是expo,如何安裝expo clinet和xde,xde如何使用

Expo大作戰(二)--expo的生命周期,expo社區交流方式,expo學習必備資源,開發使用expo時關注的一些問題

Expo大作戰(三)--針對已經開發過react native項目開發人員有針對性的介紹了expo,expo的局限性,開發時項目選型注意點等

Expo大作戰(四)--快速用expo構建一個app,expo中的關鍵術語

Expo大作戰(五)--expo中app.json 文件的配置信息

Expo大作戰(六)--expo開發模式,expo中exp命令行工具,expo中如何查看日志log,expo中的調試方式

Expo大作戰(七)--expo如何使用Genymotion模擬器

Expo大作戰(八)--expo中的publish以及expo中的link,對link這塊東西沒有詳細看,大家可以來和我交流

更多>>

接下來就開始擼碼


使用自定義字體

iOS和Android都有自己的平臺字體集,但如果您想在應用程序中注入更多品牌個性,精選字體可能會有很長的路要走。 在本指南中,我們將引導您為expo應用添加自定義字體。 在這個例子中,我們將使用來自谷歌字體的Open Sans,并且該過程對于其他任何字體都是相同的,因此可以隨意將其與您的用例相匹配。 在繼續之前,請繼續并下載Open Sans

啟動代碼

首先讓我們從一個基本的“Hello world!”應用程序開始。 在XDE/exp中創建一個新項目并將App.js更改為以下內容:

import React from 'react';
import {Text,View,
} from 'react-native';export default class App extends React.Component {render() {return (<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text style={{ fontSize: 56 }}>Hello, world!</Text></View>);}
}

在使用Open Sans之前,嘗試讓這個基本應用程序運行,這樣您就可以確定當前項目沒有什么問題。

下載字體

以您下載的Open Sans zip文件為例,將其解壓并將OpenSans-Bold.ttf復制到項目中的資產目錄中。 我們推薦的位置是your-project/assets/fonts

將字體加載到您的應用中

為了加載和使用字體,我們將使用expo的SDK,當您創建一個新的expo目時預裝,但如果由于某種原因您沒有它,您可以使用npm install --save expo安裝在您的項目中 目錄。 然后在您的應用程序代碼中添加以下導入:

import { Font } from 'expo';

expo 類庫提供了一個API,用于從JavaScript代碼訪問設備的本地功能。 font是處理字體相關任務的模塊。 首先,我們必須使用Expo.Font.loadAsync()從我們的資產目錄加載字體。 我們可以在App組件的componentDidMount()生命周期方法中執行此操作。 在App中添加以下方法:現在我們已將字體文件保存到磁盤并導入了Font SDK,接下來添加以下代碼:

export default class App extends React.Component {componentDidMount() {Font.loadAsync({'open-sans-bold': require('./assets/fonts/OpenSans-Bold.ttf'),});}// ...
}

這會加載Open Sans Bold,并將其與expo字體映射中的“open-sans-bold”名稱相關聯。 現在我們只需要在Text組件中引用這個字體。

注意:通過Expo加載的字體目前不支持fontWeight或fontStyle屬性 - 您將需要加載字體的這些變體并按名稱指定它們,正如我們在這里用粗體所做的那樣。

在Text組件中使用字體

使用React Native,您可以使用fontFamily樣式屬性在文本組件中指定字體。 fontFamily是我們用于Font.loadAsync的關鍵。

<Text style={{ fontFamily: 'open-sans-bold', fontSize: 56 }}>Hello, world!
</Text>

在下次刷新時,該應用程序似乎仍然不以Open Sans Bold顯示文本。 您會看到它仍在使用默認的系統字體。 這是由于Expo.Font.loadAsync()是一個異步調用,需要一些時間才能完成。 在完成之前,Text組件已經使用默認字體呈現,因為它無法找到'open-sans-bold'字體(所以不會加載這個我們自定義的字體)。

在渲染之前等待加載字體

當字體完成加載時,我們需要一種重新呈現Text組件的方式。 我們可以通過在App組件的狀態中保持一個boolean?值fontLoaded來跟蹤字體是否已加載(We can do this by keeping a boolean value?fontLoaded?in the?App?component’s state that keeps track of whether the font has been loaded)。 只有在fontLoaded為true的情況下,我們才會呈現Text組件。

首先我們在App類的構造函數中初始化fontLoaded為false:

class App extends React.Component {state = {fontLoaded: false,};// ...
}

接下來,當字體完成加載時,我們必須將fontLoaded設置為true。 Expo.Font.loadAsync()返回一個Promise,當字體被成功加載并準備使用時,Promise被滿足。 所以我們可以使用componentDidMount()的async / await等待字體加載,然后更新我們的狀態。

class App extends React.Component {async componentDidMount() {await Font.loadAsync({'open-sans-bold': require('./assets/fonts/OpenSans-Bold.ttf'),});this.setState({ fontLoaded: true });}// ...
}

最后,如果fontLoaded為true,我們只想渲染Text組件。 我們可以通過用以下代替Text元素來實現這一點:(完美

<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>{this.state.fontLoaded ? (<Text style={{ fontFamily: 'open-sans-bold', fontSize: 56 }}>Hello, world!</Text>) : null}
</View>

React Native會簡單地忽略空的子元素,因此當fontLoaded為false時,會跳過呈現文本組件。 現在刷新應用程序,您將看到使用open-sans-bold。

為了方便起見,此技術內置于Tabs模板中,如您在此處所見。

注意:通常,您需要在顯示應用程序之前加載應用程序的主要字體,以避免字體加載后文字閃爍。 推薦的方法是將Font.loadAsync調用移動到頂層組件

?

路由和導航

網絡上的“單頁面應用程序”不是具有單個屏幕的應用程序,這在大多數情況下確實無用(?A“single page app” on the web is not an app with a single screen, that would indeed be useless most of the time);相反,它是一個不要求瀏覽器導航到每個新屏幕的新URL的應用程序。一個“單頁面應用程序”將使用自己的路由子系統(例如:react-router)來分離正在顯示的屏幕和URL欄。通常它也會更新URL欄,但是會覆蓋會導致瀏覽器完全重新加載頁面。這樣做的目的是為了讓體驗流暢和“應用”。

這個相同的概念適用于本地移動應用當您導航到新屏幕時,不是刷新整個應用程序并從該屏幕重新開始,而是將屏幕推入導航堆棧并根據其配置將其動態顯示到視圖中。

我們推薦用于expo的路由和導航的類庫是React Navigation。您可以在React Navigation網站上查看React Nativation的完整文檔。

嘗試一下

要熟悉React Navigation的能力,最好的方法就是試用React Navigation示例Expo應用程序。在這里你可以下載一個demo關于expo中reactnavigation的體驗,體驗完成,回到這里,繼續閱讀!

?

簡介:最簡單的導航配置

您可以通過將全部以下代碼復制到App.js上一個全新的空白Expo項目中,并運行npm install react-navigation --save(安裝react-navigation組件庫)來執行此操作。

mport React from 'react';
import {Text,View,
} from 'react-native';import {StackNavigator,
} from 'react-navigation';class HomeScreen extends React.Component {static navigationOptions = {title: 'Home'};render() {return (<View style={{alignItems: 'center', justifyContent: 'center', flex: 1}}><Text onPress={this._handlePress}>HomeScreen!</Text></View>)}_handlePress = () => {this.props.navigation.navigate('Home');}
}export default StackNavigator({Home: {screen: HomeScreen,},
});

React Navigation由“路由器”,“導航器”和“屏幕”組成。在這個例子中,我們導出一個新的StackNavigator作為我們應用程序的默認組件。 StackNavigator為我們的應用程序提供了一種在每個新屏幕放置在堆棧頂部的屏幕之間轉換的方式。 StackNavigator為您的應用提供平臺原生的外觀和感覺;在iOS新屏幕從右側滑入,同時也可以適當地為導航欄設置動畫,在Android新屏幕上從底部淡入。

Navigator采用RouteConfig作為第一個選項,這是路由名稱到屏幕的映射。

大多數情況下,屏幕是普通的React組件,具有兩個特殊功能:

  1. 我們可以通過在每個屏幕組件上定義navigationOptions靜態屬性來為每個屏幕定義選項。在這個靜態屬性中,我們可以設置各種選項,例如標題,自定義左側標題視圖,或者當該屏幕可見時是否啟用導航手勢。

? ? ? ? ?2.一個特殊的navigation被傳入組件。navigation提供幫助功能,用于讀取當前導航狀態以及導航到應用中的其他屏幕。在我們的示例應用程序中,在_handlePress方法中,我們調用?     this.props.navigation.navigate以導航到Home路線并將其推送到我們的堆棧。

查看選項卡模板(Reviewing the tab template)

您可能不希望從頭開始完全完成所有項目,并且選項卡模板是來自expo的許多項目之一,希望您能夠在開發應用程序時獲得領先地位。它配備了預先安裝的react-navigation和tab-based navigation

讓我們看看與導航相關的選項卡模板的項目結構。這不是你絕對必須遵循的模式,但是我們發現它對我們來說工作得很好。(一個簡單的目錄層次)

├── App.js
├── navigation
│   ├── RootNavigation.js
│   └── MainTabNavigator.js
├── screens
│   ├── HomeScreen.js
│   ├── LinksScreen.js
│   └── SettingsScreen.js

App.js

在Expo應用程序中,此文件包含于應用程序的根組件。在選項卡模板中,這是我們呈現RootNavigation組件的位置。

navigation/ RootNavigation.js

這個組件負責渲染我們的根導航布局。盡管在本例中我們使用基于tab的布局,但您可以在Android上使用抽屜布局,或者使用其他類型的布局。在模板中,我們在App.js中呈現的RootNavigation只會指向主屏幕,并且該屏幕中的每個選項卡都呈現自己的StackNavigator組件。

我們給這個組件的另一個責任是訂閱推送通知,這樣當收到或選擇一個通知時,我們可以通過導航到一個新的路由進行響應。

?

navigation/ MainTabNavigator.js

在這個文件中,我們用三條路線,“主頁”,“鏈接”和“設置”導出一個新的TabNavigator(In this file, we export a new?TabNavigator?with three routes, “Home”, “Links”, and “Settings”)。此外,我們在TabNavigator上配置了各種選項,例如定義默認tabBarIcon導航選項的功能,禁用動畫,將選項卡欄設置在屏幕底部等。

?

screens/ * Screen.js

在我們的應用程序中代表屏幕的所有組件都被組織成一個屏幕目錄(屏幕在任何地方都沒有嚴格定義,取決于你決定你認為合適的東西 - 通常這通常是任何會被推送或彈出的東西堆棧)。

詳細了解路由和導航(Learning more about routing & navigation)

react-navigation不是唯一的React Native路由庫,但這是我們推薦的方法,我們可能無法回答您關于其他庫的問題。您可以在Github和reactnavigation.org上了解更多信息。


?

下一張繼續介紹,這一篇主要介紹了:expo中的自定義樣式Custom font,以及expo中的路由Route&Navigation?歡迎大家關注我的微信公眾號,這篇文章是否被大家認可,我的衡量標準就是公眾號粉絲增長人數。歡迎大家轉載,但必須保留本人博客鏈接!

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/255222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255222.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

懸浮按鈕

效果圖 //將dp轉換為px public static int dip2px(Context context, float dpValue) {final float scale context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale 0.5f); }//浮動圖片監聽 private void initListener() {//彈出對話框jianwen.set…

HALCON示例程序classify_image_class_svm.hdev使用SVM分類器對多通道圖像進行分類

HALCON示例程序classify_image_class_svm.hdev使用SVM分類器對多通道圖像進行分類 示例程序源碼&#xff08;加注釋&#xff09; 由于關于SVM分類器的使用之前的貼子介紹過&#xff0c;所以關于SVM的函數&#xff0c;直接點擊函數可跳轉到之前的介紹貼子。 顯示函數解釋 dev…

React Native實現NbaApp

rnNba 介紹 本項目為react-native構建的Nba App 設計靈感參考于:靈感來源( 其實就是參考樣式 功能簡單了很多,因為比較懶233333 功能 nba比分查詢球員數據查詢球隊排名查詢項目地址

圖像坐標:我想和世界坐標談談(A) 【計算機視覺學習筆記--雙目視覺幾何框架系列】

玉米竭力用輕松具體的描述來講述雙目三維重建中的一些數學問題。希望這樣的方式讓大家以一個輕松的心態閱讀玉米的《計算機視覺學習筆記》雙目視覺數學架構系列博客。這個系列博客旨在捋順一下已標定的雙目視覺中的數學主線。數學推導是有著幾分枯燥的&#xff0c;但奇妙的計算…

沖刺總結博客

項目預期計劃 完美的完成我們的耿丹師生基本信息管理系統&#xff0c;可以實現增刪改查等功能&#xff0c;能運用到我們學校里去。 實際進展 實現了增刪改查功能&#xff0c;但是要是真的運用到學校中去&#xff0c;功能還是太單一。 過程體會 這個項目是我們小組成立之后&…

img

轉載于:https://www.cnblogs.com/SoulCode/p/6508720.html

HALCON示例程序clip.hdev曲別針方向識別

HALCON示例程序clip.hdev曲別針方向識別 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’) 讀入圖片 read_image (Clip, ‘clip’) 獲得圖片尺寸大小 get_image_size (Clip, Width, Height) dev_close_window () dev_open_windo…

圖像坐標:我想和世界坐標談談(B)

二、圖像坐標&#xff1a;我想和世界坐標談談(B) 玉米將在這篇博文中&#xff0c;對圖像坐標與世界坐標的這場對話中涉及的第二個問題&#xff1a;談話方式&#xff0c;進行總結。世界坐標是怎樣變換進攝像機&#xff0c;投影成圖像坐標的呢&#xff1f; 玉米做了一個簡單的圖示…

c#基礎 函數

函數 就是方法 獨立完成某項功能的一個個體 函數的的三個好處&#xff1a;1、提高代碼的重用性。2、提高功能開發的效率&#xff0c;3.提高代碼的可維護性。 函數也分為 固定功能函數&#xff0c; 高度抽象函數。高度抽象函數應用比較廣泛&#xff0c; 函數的四要素&#…

【Android】Fragment的簡單筆記

被虐了&#xff0c;做某公司筆試時&#xff0c;發現自己連個Fragment的生命周期都寫不詳細。平時敲代碼&#xff0c;有開發工具的便利&#xff0c;有網上各大神的文章&#xff0c;就算忘了也很容易的可以查到&#xff0c;但當要自己不借助外界&#xff0c;卻發現自己似乎對該知…

HALCON示例程序color_fuses.hdev通過顏色對保險絲進行分類

HALCON示例程序color_fuses.hdev通過顏色對保險絲進行分類 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’)定義字符串變量并初始化 FuseColors : [‘Orange’,‘Red’,‘Blue’,‘Yellow’,‘Green’] FuseTypes : [5,10,15,20…

三、致敬“張正友標定”

三、致敬“張正友標定” 此處“張正友標定”又稱“張氏標定”&#xff0c;是指張正友教授于1998年提出的單平面棋盤格的攝像機標定方法。張氏標定法已經作為工具箱或封裝好的函數被廣泛應用。張氏標定的原文為“A Flexible New Technique forCamera Calibration”。此文中所提到…

Using KernelShark to analyze the real-time scheduler【轉】

轉自&#xff1a;https://lwn.net/Articles/425583/ This article brought to you by LWN subscribers Subscribers to LWN.net made this article — and everything that surrounds it — possible. If you appreciate our content, please buy a subscription and make the …

無縫滾動的算法

一早上的時間做了一個簡單的無縫滾動&#xff0c;遇到的問題特別的多&#xff0c;而且對無縫滾動的算法也不是特別的清楚。 無縫滾動效果的原理&#xff1a;就是幾個圖片 浮動成為一排&#xff1b;然后讓圖片滾動&#xff0c;正常情況下圖片滾完&#xff0c;就留下了后面的空白…

ACM題目————一筆畫問題

描述 zyc從小就比較喜歡玩一些小游戲&#xff0c;其中就包括畫一筆畫&#xff0c;他想請你幫他寫一個程序&#xff0c;判斷一個圖是否能夠用一筆畫下來。 規定&#xff0c;所有的邊都只能畫一次&#xff0c;不能重復畫。 輸入第一行只有一個正整數N(N<10)表示測試數據的組數…

HALCON示例程序color_fuses_lut_trans.hdev通過顏色對保險絲進行分類

HALCON示例程序color_fuses_lut_trans.hdev通過顏色對保險絲進行分類 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off ()定義變量并初始化&#xff0c;這些變量都是下邊識別要用到的 FuseColors : [‘Orange’,‘Red’,‘Blue’,‘Yellow’,…

上海電驅動

從行業前景上來說還可以&#xff0c;但這個公司不行&#xff0c;公司各種坑&#xff0c;從上到下各種腐敗&#xff0c;打醬油的人比較多&#xff0c;在薪資方面除了技術部稍好一點&#xff0c;其他部門我建議你最好別去了&#xff0c;整體上這個公司員工沒幸福感&#xff01;只…

1056. 組合數的和(15)

1056. 組合數的和(15) 時間限制400 ms內存限制65536 kB乙級練習題解目錄給定N個非0的個位數字&#xff0c;用其中任意2個數字都可以組合成1個2位的數字。要求所有可能組合出來的2位數字的和。例如給定2、5、8&#xff0c;則可以組合出&#xff1a;25、28、52、58、82、85&#…

3、時間和隨機數

一、時間 1.1 使用Calendar/[?kl?nd?]/類獲取時間 1.1.1 常用方法 (1)public static Calendar getInstance&#xff08;&#xff09;: 使用默認時區和語言環境獲取一個基于當前時間的Calendar對象。 (2)public int get(int field) 返回給定日歷字段表示的日歷部分的數字…

哥尼斯堡的“七橋問題” (歐拉回路,并查集)

哥尼斯堡的“七橋問題” (25分) 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含兩個島嶼及連接它們的七座橋&#xff0c;如下圖所示。 可否走過這樣的七座橋&#xff0c;而且每橋只走過一次&#xff1f;瑞士數學家歐拉(Leonhard Euler&#xff0c;1707—1783)最終解決…