react-native-vector-icons使用

最近不忙,想着说敲敲RN吧,如果你身边有android大哥或者ios大姐,你就请人家喝杯咖啡,因为真的属实能帮到你不少呢!我是win系统所以只能敲android的,rn的开发工具要用到安卓虚拟机(或者真机)、androidstudio等,对于原生白痴的我一系列的SDK报错啥的,解决起来还真的是需要时间,不过庆幸的是自己能解决的也都解决了(不能解决的有我们android小弟,哈哈!),其实只要好好跟着文档上面的步骤去安装没有问题的!好了,现在就说下这个Icon图标库的安装吧!

首先是安装:
npm install --save react-native-vector-icons
//或者
npm install -g yarn
yarn add react-native-vector-icons

Android平台上的配置(自动配置)
提示:自己亲测,属实不好用,不管报没报错还是手动配置的委托!!!

react-native link react-native-vector-icons
// 或者
npm install -g rnpm
rnpm link react-native-vector-icons

Android平台上的配置(手动配置)

---添加字体文件(这一步千万不能忘记,不然就算运行成功你也看不到图标)

到项目中的 node_modules/react-native-vector-icons/Fonts,里面有很多已经内置的图标库字体文件,依照自己的需求,复制需要的字体文件到 /app/src/main/assets/fonts ( 如果没有这个目录就自行创建 ) 即可。


1.png

2.png

---配置 android/settings.gradle
在现有的代码上添加如下代码:

include ':react-native-vector-icons'
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')

---配置主 App 的 build.gradle

dependencies {
   compile fileTree(dir: "libs", include: ["*.jar"])
   compile project(':react-native-vector-icons') //新添加的
   compile "com.android.support:appcompat-v7:23.0.1"
   compile "com.facebook.react:react-native:+"  // From node_modules
}

---修改主 App 的 MainApplication.java 文件

@Override
protected List<ReactPackage> getPackages() {
 return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        //新添加的
        new VectorIconsPackage()
        );
}

---运行报错的解决方法

error: bundling failed: Error: While resolving module `react-native-vector-icons/MaterialIcons`, the Haste package `react-native-vector-icons` was found. However the module `MaterialIcons` could not be found within the package. Indeed, none of these files exist:

这个是系统版本引发的问题,因为 React Native 系统配置的文件和 react-native-vector-icons 里面的文件重复了,解决方法就是删除重复的文件,到 /node_modules/react-native/local-cli/core/fixtures/files/package.json 里面删除了 package.json 即可,删除之前记得备份一下文件。

到这里配置就全部完成,接下来就可以在 React Native 项目中使用 iconfont 了。

!!!还有一个常见的错误是在运行时,提示不能删除某个文件,具体的错误忘记截图了,总之最后的解决办法是将文件只读属性改变了就好了。


TIM截图20180409100230.png

---简单的使用
要使用 ttf 里面的 iconfont ,首先要先知道里面有什么图标,到 node_modules\react-native-vector-icons\glyphmaps 里面可以看到很多 json 文件:


3.png

打开其中一个来看,全是下面这种结构:


4.png

不难看出,这些就是图标的字符串对应表,下面我们就在代码里面使用其中一个试试:
import Icon from "react-native-vector-icons/Ionicons"

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Icon name="ios-settings" size={15} color="red" />
        <Icon name="ios-settings" size={25} color="yellow" />
        <Icon name="ios-settings" size={35} color="black" />
      </View>
    );
  }
}

运行效果如下:


5.png

---使用自定义的 iconfont
前面都只是使用项目自带的 iconfont ,如果要使用其他人或者自己制作的 iconfont 应该怎么办呢?比如使用阿里巴巴矢量图标库上面的 iconfont 呢?

1.png

将需要的图标添加入库,然后下载代码即可:
2.png

点击下载至本地并解压缩,里面包含所有的字体文件。找到 iconfont.ttf,这是需要的文件。
4.png

要使用刚才我们下载的图标,就需要知道在 iconfont.ttf 里面的图标字符码,虽然我们可以直接在阿里巴巴矢量图标库看到具体的字符码:
5.png

这里需要忽略前面的 &#x ,主要的字符代码就是 e6a0 ;将它转为十进制的 59040 就是我们需要的 json 文件中的字符串映射。

这里数量还算少了,如果有上百个,我们一个一个来手动换算岂不是累死?这里推荐一个 Python 的工具库。

由于 React Native 的开发环境就要求安装 Python ,这里就不说怎么安装了,只需要配置好 Python 的环境变量:

6.png

通过命令行安装 fonttools

pip install fonttools

然后在 Github 上面克隆 react-native-iconfont-mapper 到本地并将刚才的 .ttf 文件放在项目根目录中即可:

7.png

在命令行中执行:

python iconfont-mapper.py iconfont.ttf iconfont.js

这样子就会生成一个 iconfont.js 文件,里面我们需要的图标映射的字符串:

var map = {"favorite":"59040","cart":"59032","back":"59031","x":"120","close":"59034","delete":"59037","edit":"59038",};
;module.exports = (name)=>String.fromCharCode(map[name]);
;module.exports.map = map;

然后我们就可以模仿着源码来使用了,通过 import Icon from "react-native-vector-icons/Ionicons" 进入源码中:

import createIconSet from './lib/create-icon-set';
import glyphMap from './glyphmaps/Ionicons.json';

const iconSet = createIconSet(glyphMap, 'Ionicons', 'Ionicons.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;

可以看到核心代码就前面 3 行,那就简单了,做点简单的修改即可:

import {createIconSet} from "react-native-vector-icons"

const glyphMap = {
    favorite: 59040,
    cart: 59032,
    back: 59031,
    x: 120,
    close: 59034,
    delete: 59037,
    edit: 59038,
};

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

export default myIcons;

回到一开始运行的 App.js ,导入这个新的 iconfont 文件:

import MyIcons from "./MyIcons";

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <MyIcons name="favorite" size={15} color="red" />
        <MyIcons name="cart" size={25} color="yellow" />
        <MyIcons name="x" size={35} color="black" />
        <MyIcons name="edit" size={45} color="gray" />
      </View>
    );
  }
}

不要以为已经完事了,还差最后一步呢。就是把 iconfont.ttf 放在 \android\app\src\main\assets\fonts

里面并重新安装 APK,才可以看到下面的结果:


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

推荐阅读更多精彩内容