ReactNative中如何使用自定義的Iconfont圖標(biāo)

????在App包的構(gòu)成中圖片資源是比較占大小的,所以我們可以利用Iconfont來替代原來的png或者jpg單色圖標(biāo)石景,iconfont的優(yōu)點(diǎn)是占Size小劈猿、支持任意大小不失真、支持任意顏色設(shè)置潮孽、平臺(tái)化管理icon等等揪荣。

當(dāng)App項(xiàng)目的大小達(dá)到一定規(guī)模時(shí),App包的Size也會(huì)隨之增大往史,這個(gè)時(shí)候我們一般會(huì)對(duì)App包的Size做分析優(yōu)化來達(dá)到減少包大小的目的仗颈,利用iconfont來替代項(xiàng)目中原有的png單色圖標(biāo)是你的一種選擇,這個(gè)之后會(huì)專門出一篇文章來記錄減包大小的相關(guān)東西椎例。

????這篇文章要分享的是在React Native開發(fā)中如何使用自定義的Iconfont圖標(biāo)挨决,并提供一鍵自動(dòng)生成對(duì)應(yīng)映射文件的腳本。

Demo及腳本地址RNIconfont【歡迎issue/star/follow~】

本文主要分為三部分:

  • react-native-vector-icons庫的集成與使用
  • 如何使用任意自定義的iconfont
  • 編寫腳本來快捷生成iconfont映射文件

1.react-native-vector-icons庫的集成與使用

react-native-vector-icons是ReactNative開發(fā)中十分好用的一個(gè)用來展示iconfont圖標(biāo)的庫订歪。

集成只要兩步:
1.引入依賴

Run: npm install --save react-native-vector-icons

2.鏈接原生庫

Run: react-native link react-native-vector-icons

如果第二步鏈接失敗或者運(yùn)行錯(cuò)誤脖祈,可以自己手動(dòng)鏈接,具體可以參考react-native-vector-icons說的比較清楚了刷晋。

集成完畢后盖高,可以看到這個(gè)庫默認(rèn)引入了幾個(gè)ttf文件(android項(xiàng)目在assets/fonts下):


默認(rèn)引入的ttf文件

也就是說這些ttf文件中所有icon都可以直接使用慎陵,下面就說一下如何使用。

使用非常簡單喻奥,如下:

import Icon from "react-native-vector-icons/Ionicons";

<Icon name='md-pricetag' size={16} color='#cccccc'></Icon>

2.如何使用任意自定義的iconfont

????上面介紹了react-native-vector-icons庫的使用席纽,但是目前為止你能使用的iconfont只有上面說的默認(rèn)引入的那些ttf文件中的icon,因?yàn)樯厦嫠褂玫?lt; Icon>< /Icon>只支持默認(rèn)引入的那些icon。

????這樣顯然不能滿足我們的要求映凳,我們想要使用自己的iconfont,那么我們該如何做呢胆筒,這里以從阿里iconfont平臺(tái)上選擇自己想要的icon為例做介紹。

一诈豌、從阿里iconfont平臺(tái)上挑選自己想要的icon仆救,打包下載到本地并解壓,如下:

解壓后的目錄

二矫渔、將iconfont.ttf文件copy到android項(xiàng)目的assets/fonts目錄下

三彤蔽、自定義圖標(biāo)庫
CXIcon.js

import createIconSet from 'react-native-vector-icons/lib/create-icon-set';
import glyphMap from './iconfont.json';

const iconSet = createIconSet(glyphMap, 'CXIcon', 'iconfont.ttf');

export default iconSet;

export const Button = iconSet.Button;
export const TabBarItem = iconSet.TabBarItem;
export const TabBarItemIOS = iconSet.TabBarItemIOS;
export const ToolbarAndroid = iconSet.ToolbarAndroid;
export const getImageSource = iconSet.getImageSource;

看到import glyphMap from './iconfont.json'了嗎,所以這里我們還需要一個(gè)iconfont.json庙洼,也就是映射map顿痪。

iconfont.json:

{
  "biscuit": 58983,
  "pizza": 59024,
  "dangao": 59080
}

這是我們在阿里iconfont上下載的三個(gè)icon對(duì)應(yīng)的Unicode碼。

ok油够,到這里我們就可以使用<CXIcon></CXIcon>來展示我們自定義下載的幾個(gè)icon了蚁袭,使用如下:

import React, {Component} from 'react';
import {
    Text,
    View
} from 'react-native';
import CXIcon from "./components/cxicon/CXIcon";

type Props = {};
export default class App extends Component<Props> {
    render() {
        return (
            <View style={styles.container}>
                <Text>展示來自自定義的ttf文件的icon</Text>
                <CXIcon name='biscuit' size={50} color='#226688'></CXIcon>
            </View>
        );
    }
}

3.編寫腳本自動(dòng)生成上面的iconfont.json映射文件

????看完第二步 其實(shí)你就已經(jīng)可以自由的使用自己選擇的icon圖標(biāo)了,但是你會(huì)發(fā)現(xiàn)一個(gè)問題石咬,上面我們需要一個(gè)iconfont.json映射文件揩悄,這個(gè)映射文件是我們手寫的,如果只有3個(gè)圖標(biāo)那我們可以手寫鬼悠,那如果是300個(gè)圖標(biāo)删性,如果還手寫,那就不是程序員的風(fēng)格了焕窝,我們的風(fēng)格是什么蹬挺?沒錯(cuò),是懶惰它掂,不可能做重復(fù)的工作的巴帮,這輩子都不可能做重復(fù)的工作的。

????回到上面虐秋,我們從阿里iconfont平臺(tái)下載到的zip壓縮包解壓縮后里面有一個(gè)iconfont.svg文件晰韵,我們就根據(jù)這個(gè)文件來解析生成我們想要的iconfont.json映射文件,擼起袖子熟妓,寫個(gè)shell腳本。

iconfont_mapper.sh:

#!/bin/sh

if [ $# != 1 ] ; then

    echo "usage: $0 iconfont.svg(your svg file name)  "
    exit
fi

#OutputFile path,you can customize your path
OutputFileName=`echo iconfont.json`

mapper=` awk '{ if($0 ~ /glyph-name/) print $0;  if($0 ~ /unicode/)  print $0"|split|" }'  $1| tr '[:upper:]' '[:lower:]'| awk '{print $0}'  RS='\='| tr "\n\"&#;" " "| awk  '{ if ($1!="split"&&$1!=""){ printf ("\""$3"\":"); printf ($5","); print "\r " }}' RS="|split|" | sed "s/-/_/g"`

rm $OutputFileName
echo "{" >> $OutputFileName
echo $mapper >> $OutputFileName
echo "}" >> $OutputFileName

#usage:
# ./iconfont_mapper.sh svg_file_path

使用:
命令行執(zhí)行: ./iconfont_mapper.sh iconfont.svg 即可栏尚。

注意:如果你的iconfont_mapper.sh腳本和iconfont.svg文件沒有放在同一個(gè)文件目錄下起愈,則iconfont.svg需要拼全路徑。

????執(zhí)行完這個(gè)腳本你就會(huì)發(fā)現(xiàn)在腳本所在的目錄下自動(dòng)生成了我們需要的iconfont.json映射文件。將它放到項(xiàng)目中即可抬虽。

Demo及腳本地址RNIconfont【歡迎issue/star/follow~】

最后官觅,希望世界上的每個(gè)icon都可大可小,高清無瑕~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阐污,一起剝皮案震驚了整個(gè)濱河市休涤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笛辟,老刑警劉巖功氨,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異手幢,居然都是意外死亡捷凄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門围来,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跺涤,“玉大人,你說我怎么就攤上這事监透⊥按恚” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵胀蛮,是天一觀的道長院刁。 經(jīng)常有香客問我,道長醇滥,這世上最難降的妖魔是什么黎比? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鸳玩,結(jié)果婚禮上阅虫,老公的妹妹穿的比我還像新娘。我一直安慰自己不跟,他們只是感情好颓帝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窝革,像睡著了一般购城。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虐译,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天瘪板,我揣著相機(jī)與錄音,去河邊找鬼漆诽。 笑死侮攀,一個(gè)胖子當(dāng)著我的面吹牛锣枝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兰英,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼撇叁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畦贸?” 一聲冷哼從身側(cè)響起陨闹,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄坏,沒想到半個(gè)月后趋厉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颤殴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年觅廓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涵但。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杈绸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矮瘟,到底是詐尸還是另有隱情瞳脓,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布澈侠,位于F島的核電站劫侧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哨啃。R本人自食惡果不足惜烧栋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拳球。 院中可真熱鬧审姓,春花似錦、人聲如沸祝峻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莱找。三九已至酬姆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奥溺,已是汗流浹背辞色。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工评矩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摔踱,地道東北人铲汪。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓金踪,卻偏偏與公主長得像幻馁,于是被迫代替她去往敵國和親绞吁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哗脖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容