iconfont技术分享

2020-01-18  本文已影响0人  gy先生

提问

用字体来代替图标 阿里iconfont

iconfont 制作的基本原理

Unicode 码表是一个很大的表格,每个表格都对应一个 Unicode 字符,每个字符都有一个 Unicode 码值对应,如 “李” 对应 “\u674e”, “靖” 对应 “\u9756”。因为码表很大,有部分表格并没有对应的字符,但是它有自己的码值。iconfont 的制作,首先将绘制的图形(可以是一张图片、也可以是一个 svg 描述)通过工具或者程序生成文字icon,然后将文字icon对应到码表之中,为了不干预码表中已有的字符,我们通常会把文字icon对应到没有字符的表格中,最后导出我们额外对应的表格信息,生成iconfont。如下图所示:

                              Unicode 码表
                           +-----------------+
           ...             |     |     |     |
                           |     |     |     |
   图形icon     文字icon    +-----------------+
  +-------+    +------+    |     |     |     |
  |icon a +---->   A  +-----------> Ua |     |
  +-------+    +------+    |     |     |     |
                           +-----------------+
  +-------+    +------+    |     |     |     |
  |icon b +---->   B  +-----> Ub +     |     +------> iconfont
  +-------+    +------+    |     |     |     |
                           +-----------------+
  +-------+    +------+    |     |     |     |
  |icon C +---->   C  +-----> Uc |     |     |
  +-------+    +------+    |     |     |     |
                           +-----------------+
           ...             |     |     |     |
                           |     |     |     |
                           +-----------------+

图中,三个icon分别对应到 Unicode 码表中码值为 Ua Ub Uc 的三个表格,那么最后导出的 iconfont 也就只包含这三个字符信息,这个体积是很小的。

SVG

一种xml格式的字体数据,每个字的图形对应了一个路径。这个路径就是我们svg里面的path对应的序列。

[图片上传失败...(image-7204df-1579312307888)]

好了于是我们有了一个全新的思路,由设计师上传svg,我们存储下来,然后大家自由组合,由平台拼出对应的svg字体,然后再转换到不同的其他格式的字体。

[图片上传失败...(image-9d0b45-1579312307888)]

使用注意要点

/** oc **/
#define ICON_ZHI_SHU @"\U0000e619"
/** swift **/
static let ICON_JING_XUAN:String = "\u{0000e601}";
      
    public IconTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        changeTypeFace(context,attrs);
    }

    private void changeTypeFace(Context context, AttributeSet attrs)
    {
        if (attrs != null)
        {
            Typeface mtf = Typeface.createFromAsset(context.getAssets(),
                    iconPath);
            super.setTypeface(mtf);
        }
    }

缺点

自动化创建资源配置类

下载示例工程文件,找到translate.sh脚本


image

执行脚本,生成的.h或者.swift直接在iOS工程项目中导入使用,生成的strings.xml导入到android项目中

#创建IconFontConfig.h
./translate.sh objc

#创建IconFontConfig.swift
./translate.sh swift

#创建strings.xml
./translate.sh java

为了避免android项目中默认strings.xml中已经配置资源,和现有的资源文件冲突,建议在项目中另外创建一个资源文件夹存放iconfont生成的strings.xml资源描述

android {
    compileSdkVersion 26
    defaultConfig {
        ......
    }
    buildTypes {
        ......
    }
    sourceSets {
        main {
            res.srcDirs "src/main/res-icon"
        }
    }
}

这样iconfont生成的strings.xml可以存放在该目录下互不冲突


image image
上一篇 下一篇

猜你喜欢

热点阅读