关于更多知识,可以进网站学习。时空传送门
什么是SVG?
- SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
- SVG 用来定义用于网络的基于矢量的图形
- SVG 使用 XML 格式定义图形
- SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失
- SVG 是万维网联盟的标准
- SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体
SVG 的优势
- SVG 可被非常多的工具读取和修改(比如记事本)
- SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。
- SVG 是可伸缩的
- SVG 图像可在任何的分辨率下被高质量地打印
- SVG 可在图像质量不下降的情况下被放大
- SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)
- SVG 可以与 Java 技术一起运行
- SVG 是开放的标准
- SVG 文件是纯粹的 XML
SVG 的主要竞争者是 Flash。
与 Flash 相比,SVG 最大的优势是与其他标准(比如 XSL 和 DOM)相兼容。而 Flash 则是未开源的私有技术。
今天,所有浏览器均支持 SVG 文件,不过需要安装插件的 Internet Explorer 除外。插件是免费的,比如 Adobe SVG Viewer。
SVG路径指令
M = moveto(M X,Y) :相当于 android Path 里的moveTo(),用于移动起始点
L = lineto(L X,Y): 相当于 android Path 里的lineTo(),用于画线
H = horizontal lineto(H X):画水平线到指定的X坐标位置
V = vertical lineto(V Y):画垂直线到指定的Y坐标位置
C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY): 相当于cubicTo(),三次贝塞尔曲线
S = smooth curveto(S X2,Y2,ENDX,ENDY) : 同样三次贝塞尔曲线,更平滑
Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY): quadTo(),二次贝塞尔曲线
T = smooth quadratic Belzier curveto(T ENDX,ENDY): 同样二次贝塞尔曲线,更平滑
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y): 相当于arcTo(),用于画弧
Z = closepath 相当于closeTo(),关闭path
注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
对cubicTo等方法不了解的可以看我的另一篇博客,Android的path解析
路径也属于SVG形状中的一种,但因为在Android中格外重要,所以专门说明。
SVG实例
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<path d="M250 150 L150 350 L350 350 Z" stroke="black"
stroke-width="2" fill="red"/>
</svg>
代码解释:
第一行包含了 XML 声明。请注意 standalone 属性!该属性规定此 SVG 文件是否是“独立的”,或含有对外部文件的引用。
standalone=”no” 意味着 SVG 文档会引用一个外部文件 - 在这里,是 DTD 文件。
第二行和第三行引用了这个外部的SVG DTD。该DTD位于http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd。该DTD位于W3C,含有所有允许的SVG元素。
SVG 代码以svg元素开始,包括开启标签 svg 和关闭标签svg 。这是根元素。width 和 height 属性可设置此 SVG 文档的宽度和高度。version 属性可定义所使用的 SVG 版本,xmlns 属性可定义 SVG 命名空间。
定义了一条路径,它开始于位置 250 150,到达位置 150 350,然后从那里开始到 350 350,最后在 250 150 关闭路径。
stroke 和 stroke-width 属性控制如何显示形状的轮廓。我们把圆的轮廓设置为 2px 宽,黑边框。
fill 属性设置形状内的颜色。我们把填充颜色设置为红色。
关闭标签的作用是关闭 SVG 元素和文档本身。
注释:所有的开启标签必须有关闭标签!
得到的结果也与我解释的一样。
SVG形状
SVG 有一些预定义的形状元素,可被开发者使用和操作:
- 矩形 rect
- 圆形 circle
- 椭圆 ellipse
- 线 line
- 折线 polyline
- 多边形 polygon
- 路径 path
rect标签
<rect width="300" height="100"
style="fill:rgb(0,0,255);stroke-width:1;
stroke:rgb(0,0,0)"/>
circle 标签
<circle cx="100" cy="50" r="40" stroke="black"
stroke-width="2" fill="red"/>
cx 和 cy 属性定义圆点的 x 和 y 坐标。如果省略 cx 和 cy,圆的中心会被设置为 (0, 0)
r 属性定义圆的半径。
ellipse标签
<ellipse cx="300" cy="150" rx="200" ry="80"
style="fill:rgb(200,100,50);
stroke:rgb(0,0,100);stroke-width:2"/>
- cx 属性定义圆点的 x 坐标
- cy 属性定义圆点的 y 坐标
- rx 属性定义水平半径
- ry 属性定义垂直半径
line标签
<line x1="0" y1="0" x2="300" y2="300"
style="stroke:rgb(99,99,99);stroke-width:2"/>
polygon标签
<polygon points="220,100 300,210 170,250"
style="fill:#cccccc;
stroke:#000000;stroke-width:1"/>
polyline 标签
<polyline points="0,0 0,20 20,20 20,40 40,40 40,60"
style="fill:white;stroke:red;stroke-width:2"/>
因为Android中并不会用到,所以只提一下。
SVG 填充
fill-rule:
关于图形(或线条)的内部区域,是由 fill-rule 属性决定的,它有 nonzero 和 evenodd 两个值。
nonzero—这个规则通过从canvas上的某个点往任一方向绘制射线到无穷远,然后检查图形的线段和射线相交的点,来确定“内部区域”。从0开始计数,每次路径线段是从左到右穿过射线就加一,从右到左的就减一。通过计算交叉点,如果结果是0,则这个点在路径外边,不然,就是在里边。在外边是不会被设置颜色的。
evenodd—这个规则通过从canvas上某个点往任一方向绘制射线到无穷远,然后计算给定图形上线段路径和该射线交叉点的数量。如果这个数是奇数,那么该点在图形内部;如果是偶数,该点在图形外部。
举例说明:第一幅图取中心点,往任一方向绘制射线,发现与图形的交点始终由射线的同一方向来,所以计数既不等于0且为偶数,使用nonzero中间填充颜色,而evenodd不填充。
SVG Stroke
- stroke 定义一条线,文本或元素轮廓颜色
- stroke-width 定义了一条线,文本或元素轮廓厚度
- stroke-opacity 定义了一条线,文本或元素轮廓透明度
stroke-linecap 定义不同类型的开放路径的终结,可以让你在线条末端控制图形。你可以选择对接(butt)、方形(square)和圆形(round)。
stroke-dasharray 用于设置虚线的属性。你可以使用它来设置每条划线长度以及划线之间空格的大小。有两个参数,第一个是线的长度,第二个是空格的大小。
stroke-linejoin 控制的是两条线段之间的衔接。你可以在绘制折线时使用它。它有三个值,尖角(miter)、圆角(round)和斜角(bevel)。
SVG编辑器
通过上面的介绍,相信大家都已经清楚SVG的功能是多么多和强大了,但是对于没有基础的人来说,SVG的语法未免太繁琐了,极大的增加了我们学习和使用的难度,所以我推荐大家使用SVG的编辑器。
SVG编辑器有很多种,我这里只说两种,一种是在线的,一种离线的。
在线的我推荐Method Draw。
离线的我推荐inkscape。
inkscape的下载网址是https://inkscape.org/en/
有Windows,Mac OS X, Linux,你只要下载你对应系统的版本。
下载安装完后,我们就可以看到这样的界面了。
另外,我们用浏览器打开一个.svg文件,右键点击查看网页源代码,就可以看到SVG的代码了。
如果要在Android中使用svg,更多的是使用path,所以我们要把它和Vector标签联合使用,在这里我只介绍SVG的功能,如何在Android中使用,欢迎大家看我的另一篇博客Vector标签解析。
结束语:本文仅用来学习记录,参考查阅。