ReactNative中如何使用自定义的Iconfont图标

    在App包的构成中图片资源是比较占大小的,所以我们可以利用Iconfont来替代原来的png或者jpg单色图标,iconfont的优点是占Size小、支持任意大小不失真、支持任意颜色设置、平台化管理icon等等。

当App项目的大小达到一定规模时,App包的Size也会随之增大,这个时候我们一般会对App包的Size做分析优化来达到减少包大小的目的,利用iconfont来替代项目中原有的png单色图标是你的一种选择,这个之后会专门出一篇文章来记录减包大小的相关东西。

    这篇文章要分享的是在React Native开发中如何使用自定义的Iconfont图标,并提供一键自动生成对应映射文件的脚本。

Demo及脚本地址RNIconfont【欢迎issue/star/follow~】

本文主要分为三部分:

  • react-native-vector-icons库的集成与使用
  • 如何使用任意自定义的iconfont
  • 编写脚本来快捷生成iconfont映射文件

1.react-native-vector-icons库的集成与使用

react-native-vector-icons是ReactNative开发中十分好用的一个用来展示iconfont图标的库。

集成只要两步:
1.引入依赖

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

2.链接原生库

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

如果第二步链接失败或者运行错误,可以自己手动链接,具体可以参考react-native-vector-icons说的比较清楚了。

集成完毕后,可以看到这个库默认引入了几个ttf文件(android项目在assets/fonts下):


默认引入的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只有上面说的默认引入的那些ttf文件中的icon,因为上面所使用的< Icon>< /Icon>只支持默认引入的那些icon。

    这样显然不能满足我们的要求,我们想要使用自己的iconfont,那么我们该如何做呢,这里以从阿里iconfont平台上选择自己想要的icon为例做介绍。

一、从阿里iconfont平台上挑选自己想要的icon,打包下载到本地并解压,如下:

解压后的目录

二、将iconfont.ttf文件copy到android项目的assets/fonts目录下

三、自定义图标库
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'了吗,所以这里我们还需要一个iconfont.json,也就是映射map。

iconfont.json:

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

这是我们在阿里iconfont上下载的三个icon对应的Unicode码。

ok,到这里我们就可以使用<CXIcon></CXIcon>来展示我们自定义下载的几个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.编写脚本自动生成上面的iconfont.json映射文件

    看完第二步 其实你就已经可以自由的使用自己选择的icon图标了,但是你会发现一个问题,上面我们需要一个iconfont.json映射文件,这个映射文件是我们手写的,如果只有3个图标那我们可以手写,那如果是300个图标,如果还手写,那就不是程序员的风格了,我们的风格是什么?没错,是懒惰,不可能做重复的工作的,这辈子都不可能做重复的工作的。

    回到上面,我们从阿里iconfont平台下载到的zip压缩包解压缩后里面有一个iconfont.svg文件,我们就根据这个文件来解析生成我们想要的iconfont.json映射文件,撸起袖子,写个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

使用:
命令行执行: ./iconfont_mapper.sh iconfont.svg 即可。

注意:如果你的iconfont_mapper.sh脚本和iconfont.svg文件没有放在同一个文件目录下,则iconfont.svg需要拼全路径。

    执行完这个脚本你就会发现在脚本所在的目录下自动生成了我们需要的iconfont.json映射文件。将它放到项目中即可。

Demo及脚本地址RNIconfont【欢迎issue/star/follow~】

最后,希望世界上的每个icon都可大可小,高清无瑕~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容