SVG字体图标格式解析

最近在写一个安卓APP,没有美工,UI也只能自己弄。

界面结构XML文件都搞定了,但部分图标总找不合适的,找到合适的,还要存成5种分辨率大小,好一个烦字了得!

做为程序员,我身上的黑客基因告诉我,绝对不能干这种重复的工作!我要自动化!解决这个问题!

于是花了一周时间写了个小工具AppIconTools,使用网阿里图标库和一个SVG字体图标来生成APP图标。

软件的核心就是解析生成SVG文件。经过研究发现阿里图标库内也使用的是SVG字体。下面将SVG字体几个要点解说一下:


首先推荐两款有名的SVG字体图标

  1. 系出名门来自Bootstrap的的Font Awesome:http://www.bootcss.com/p/font-awesome/
  2. Fontello:http://fontello.com/

下载时里面会有一个SVG格式的字体图标文件,其实就是个XML文件。下面介绍一下这个文件的结构


最重要的标签有三个font、font-face、glyph。

我们要从这三个标签里获取的数据主要有:宽、高、基线偏移量、绘制数据

数据获取:

  1. 在font标签内获取默认字符宽度horiz-adv-x,例:<font id="fontawesomeregular" horiz-adv-x="1536" >
  2. 在font-face标签内获取默认高度units-per-em 和下移量 ascent,例:<font-face units-per-em="1792" ascent="1536" descent="-256" />
  3. 在每个符号中查询是否存在特别的宽度horiz-adv-x,有则替换默认字符宽度。例:<glyph unicode="&#xf00b;" horiz-adv-x="1792"
  4. 在每个符号中获取绘制数据 d 。例:<glyph glyph-name="emo-wink2" unicode="&#xe802;" d="M664 800c-61 0-110-65-110-144 ........."

XML的解析获取应该不是难事,这里就不进行解说了。

获取出了数据之后,我用上面的数据生成了标准的SVG图元文件,再用

为了很好的将字体图标绘制出来,需要知道:宽、高、下移量
构造一个类来存这些数据用org.apache.batik绘制生成PNG图标

生成XML的代码:

    public static String makeSvgXml(DrawSize d) {
        StringBuilder sb = new StringBuilder();
        sb.append("<?xml version=\"1.0\" standalone=\"no\"?>\n");
        sb.append("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n");
        sb.append("\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
        sb.append("<svg width=\"").append(d.size).append("\" height=\"").append(d.size).append("\" viewBox=\"0 0 ").append(d.size).append(" ").append(d.size).append("\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n");
        sb.append("<g class=\"transform-group\">\n");
        sb.append("<g transform=\"translate(").append(d.x).append(", ").append(d.y).append(") scale(1, -1) scale(").append(d.scale).append(", ").append(d.scale).append(")\">");
        sb.append(d.oSize.svgPath.replace("#737383", d.color));
        sb.append("</g></g></svg>");
        return sb.toString();
    }

AppIconTools源码已开源,可从https://code.csdn.net/do168/appicontools/tree/master 下载


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:示例代码是一段用SVG语言编写的代码,用于创建一个SVG图形。其中包括三个SVG元素,分别是矩形(rect)、圆形(circle)。这段代码的viewBox属性用于定义SVG画布的范围,指定了坐标系统的范围和位置。 引用:viewBox详解:SVG画布只是用于展示SVG世界中某一个范围的内容,而对于超过了SVG画布范围的内容,则会被遮挡。viewBox属性用于指定SVG画布范围,可以通过设置不同的值来调整显示的内容。默认情况下,SVG画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 引用:创建svgIcon component的代码是一个Vue组件,用于创建一个可复用的SVG图标组件。该组件接受一个iconClass属性作为参数,根据该属性动态生成图标的名称。这个组件使用了SVG的<use>元素,用于引用外部的SVG文件并在页面上显示。 问题:请告诉我,<svg width="1em" height="1em" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">的作用是什么? <svg width="1em" height="1em" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">是一个SVG图形,它的作用是在页面上显示一个大小为1em的SVG图标。通过设置width和height属性为1em,可以根据父元素的字体大小自动调整图标的尺寸。viewBox属性用于定义SVG画布的范围,指定了坐标系统的范围和位置,这里的viewBox设置为"0 0 100 100"表示画布范围是一个100x100的正方形。同时,这个SVG元素还使用了xmlns属性指定了命名空间为"http://www.w3.org/2000/svg",以确保浏览器正确解析SVG语法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值