美文网首页
iconfont技术分享

iconfont技术分享

作者: gy先生 | 来源:发表于2020-01-18 09:50 被阅读0次

    提问

    • 提需求的人图标样式(颜色)要换?
    • 图标如何满足不同的分辨率以及清晰度?
    • 图标太多导致项目体积越来越大,如何瘦身?
    • 按钮状态切换只用一个图标,例如点击和松开,甚至更多的状态?

    用字体来代替图标 阿里iconfont

    • 轻量性:一个图标字体比一系列的图像(特别是在Retina屏中使用双倍图像)要小。一旦图标字体加载了,图标就会马上渲染出来,不需要下载一个图像。可以减少HTTP请求,还可以配合HTML5离线存储做性能优化。

    • 灵活性:图标字体可以用过font-size属性设置其任何大小,还可以加各种文字效果,包括颜色、Hover状态、透明度、阴影和翻转等效果。可以在任何背景下显示。使用位图的话,必须得为每个不同大小和不同效果的图像输出一个不同文件。

    • 跨平台:支持android,iOS,web,微信小程序。

    • 兼容性:网页字体支持所有现代浏览器,包括IE低版本。

    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)]

    使用注意要点

    • 字体使用unicode码去引用,容易散落各地,应该统一写在配置文件中通过变量访问
    • iOS oc和swift表示方式不同
    /** oc **/
    #define ICON_ZHI_SHU @"\U0000e619"
    /** swift **/
    static let ICON_JING_XUAN:String = "\u{0000e601}";
    
    • android需要通过代码修改Typeface来使用iconfont字体,可自己创建个TextView类初始化的时候添加好字体,方便layout.xml中使用
          
        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);
            }
        }
    
    • 微信小程序无法使用外部字体,需要字体通过base64编码后的字符串引入

    缺点

    • 图标字体只能被渲染成单色或者CSS3的渐变色,由于此限制使得它不能广泛使用。

    • 使用版权上有限制,有好多字体是收费的。当然也有很多免费开源的精美字体图标供下载使用。

    • 创作自已的字体图标很费时间,重构人员后期维护的成本偏高

    • 开发app的情况下仅限于本地icon显示,远程图标仍然只能使用图片的形式。

    自动化创建资源配置类

    下载示例工程文件,找到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

    相关文章

      网友评论

          本文标题:iconfont技术分享

          本文链接:https://www.haomeiwen.com/subject/vekkzctx.html