SVG基本圖形的創建和動畫詳解——1

一.引言

  SVG全稱爲“Scalable Vector Graphics”,意爲可縮放矢量圖形。而什麼是矢量圖?矢量就是向量,所以矢量圖就意味着無限縮放而不改變圖片的質量。
  多說無益,下面放MDN上關於SVG的定義:

SVG是XML語言的一種形式,有點類似XHTML,它可以用來繪製矢量圖形,例如右面展示的圖形。SVG可以通過定義必要的線和形狀來創建一個圖形,也可以修改已有的位圖,或者將這兩種方式結合起來創建圖形。圖形和其組成部分可以變形,可以合成,還可以通過濾鏡完全改變外觀。

  SO~你可以像創建html dom元素一樣,用類似的標籤來愉快的創建各種矢量圖形。當然,SVG有一套自己的規範。老規矩,關門放MDN:
  

HTML提供了定義標題、段落、表格等等內容的元素。與此類似,SVG也提供了一些元素,用於定義圓形、矩形、簡單或複雜的曲線,以及其他形狀。一個簡單的SVG文檔由根元素和基本的形狀元素構成。另外還有一個g元素,它用來把若干個基本形狀編成一個組。從這些開始,SVG可以成爲任何複雜的組合圖形。SVG支持漸變、旋轉、濾鏡效果、JavaScript接口等等功能,但是所有這些額外的語言特性,都需要在一個定義好的圖形區域內實現。

二.簡單圖形的創建

  1. 線(line)
<svg width="100" height="100">
  <line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-width:2" />
</svg>

  結果:
  這是SVG線條
  上訴標籤<line />就是SVG專門用來創建線的元素。其中X1與y1代表第一個座標在X軸和Y軸中的位置,X2,Y2以此類推。
而最終出現的圖形就是這兩個點連起來形成的閉合路徑。  

2.折線(polyline)

<svg width="200" height="200">
  <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" style="fill:none;stroke:black;stroke-width:3" />
</svg>

  結果:
  這是SVG折線
  
  上述標籤<polyline/>就是SVG專門用來創建折線的元素。關於points的詳細解釋請看下面的多邊形(polygon)。

3.矩形(rect)

<svg width="200" height="100">
   <rect width="200"height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)" />
</svg>

  結果:
  這是SVG rect矩形
  <rect />就是SVG專門用來創建矩形的元素。且無需設定座標。
  
  
4.圓形(circle)

<svg width="200" height="100">
   <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
</svg> 

  結果:
  這是SVG圓形
  <circle />就是SVG專門用來創建圓形的元素。cx和cy表示圓心的座標,r表示圓的半徑。
 
  
5.橢圓(ellipse)

<svg width="200" height="100">
  <ellipse cx="100" cy="50" rx="90" ry="40" style="fill:yellow" />
</svg>

  結果:
  這是SVG橢圓
  <ellipse />就是SVG專門用來創建橢圓形的元素。cx和cy表示圓心的座標,rx表示圓心到橢圓左右兩側的半徑,ry表示圓心到橢圓上下兩側的半徑。
  
  
6.多邊形(polygon)

6.1 三角形

<svg width="200" height="100">
  <polygon points="100,0 40,80 160,80" style="fill:gray" />
</svg>

  結果:
  這是SVG polygon 三角形
  <polygon />在用來創建多邊形時,關鍵的屬性就在於points。以上面那個例子來說,“100,0”爲一個座標,分別表示這個點在x軸和y軸的位置。座標點與座標點之間以空格分開。最終的圖形就是這幾個點連起來成的閉合路徑形成的圖案。
  
6.2 矩形

<svg width="500" height="500">
  <polygon points="10,10 170,10 170,80 10,80" style="fill:gray" />
</svg>

  結果:
  這是SVG polygon矩形
  由此可見,<polygon />也可以用來創建矩形。

6.3 六邊形

<svg width="500" height="500">
  <polygon points="0,40 30,0 100,0 130,40 100,80 30,80" style="fill:gray" />
</svg>

  結果:
  這是SVG polygon六邊形
  從這個points裏的座標點可以看出,svg渲染points裏的點是從左往右渲染的,也就是說你在寫座標點時也要按照這個順序來。
  
6.4 星形

<svg width="200" height="200">
  <polygon points="100,10 40,180 190,60 10,60 160,180" style="fill:gray;"/>
</svg>

  結果:
  這是SVG polygon星形
  這個星形就是同通過按順序描點連線後生成的圖形,描點順序大概如下:
  星形描點順序
  所以只要捋清楚你要畫的圖形的描點順序和大概座標,就可以畫出很多複雜的圖形。
 
 

三.複雜圖形的創建

複雜圖形的創建,要用到<path />這個元素。
MDN對path的解釋爲:

path元素是用來定義形狀的通用元素。所有的基本形狀都可以用path元素來創建。

當然,<path />裏也提供了一個重要的屬性來繪製圖形,那就是d。MDN上對 path d屬性的描述如下:

The d attribute provides a path definition to be drawn.
A path definition is a list of path commands where each command is made of a letter and some numbers representing the parameter of the command. All possible commands are detailed below.

大概意思就是:

d屬性提供了要繪製的路徑定義。
路徑定義是路徑命令的列表,其中每個命令都由一個字母組成,一些數字表示命令的參數。所有可能的命令如下所示。

M = moveto
L = lineto
H = horizontal lineto
V = vertical lineto
C = curveto
S = smooth curveto
Q = quadratic Bézier curve
T = smooth quadratic Bézier curveto
A = elliptical Arc
Z = closepath

需要注意的一點是,以上所有命令都可以才用大小寫,大寫代表絕對定位,小寫代表相對定位(比如相對上一個節點移動10px)
下面我們就講講這些命令的含義:

M :【繪製作圖開始點】
L :【繪製作圖結束點】
H :【繪製平行線】
V :【繪製垂直線】
C :【三次貝塞爾曲線】
S :【簡寫三次貝塞爾曲線】
Q :【二次貝塞爾曲線】
T :【簡寫二次貝塞爾曲線】
A :【繪製橢圓弧】
Z :【閉合路徑】

下面根據順序舉例:

1. M 10 10表示需要移動到的點的x軸和y軸的座標。
2. L 10 20表示在當前位置和新位置(L前面畫筆所在的點)之間畫一條線段。
3. H 30表示繪製一段30的水平線。
4. V 20表示繪製一段20的垂直線。

5.三次貝塞爾曲線C:

C x1 y1, x2 y2, x y
(x,y)表示的是曲線的終點,(x1,y1)是起點的控制點,(x2,y2)是終點的控制點。
控制點描述的是曲線起始點的斜率。

<svg width="200" height="100">
  <path d="M10 10 C 20 20, 40 20, 50 10" stroke="black" fill="transparent"/>
</svg>

如下圖:
這裏寫圖片描述

什麼意思呢?從M聲明的(10,10)到C的最後一個座標(50,10)。而這條曲線曲折的程度這取決於兩個控制點的斜率。起點的斜率是M(10,10)與C(20,20)連成的起點的直線的斜率。這條直線就是起點沿起點控制點的切線。終點的斜率以此類推。

6.簡寫三次貝塞爾曲線S

S x2 y2, x y
如果S命令跟在一個C命令或者另一個S命令的後面,它的第一個控制點,就會被假設成前一個控制點的對稱點。如果S命令單獨使用,前面沒有C命令或者另一個S命令,那麼它的兩個控制點就會被假設爲同一個點。

<svg width="190px" height="160px" >
  <path d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" stroke="black" fill="transparent"/>
</svg>

如下圖:
這裏寫圖片描述
也就是說,當你需要對稱的曲線時,你可以使用S指令。

7.二次貝塞爾曲線Q

Q x1 y1, x y
二次貝塞爾曲線Q,只需要一個控制點和一個終點座標。

<svg width="190px" height="160px">
  <path d="M10 80 Q 95 10 180 80" stroke="black" fill="transparent"/>
</svg>

如下圖:
這裏寫圖片描述

8.簡寫二次貝塞爾曲線T

T x y
T只需要一個控制點就可以繪製出與上一條曲線對稱的曲線。

<svg width="190px" height="160px">
  <path d="M10 80 Q 52.5 10, 95 80 T 180 80" stroke="black" fill="transparent"/>
</svg>

如下圖:
這裏寫圖片描述
需要注意的是,在使用T命令時要確保它的前面是一個Q命令或者T命令。如果單獨使用了T命令,會繪製出一條直線,因爲控制點和終點會被認爲是一個點。

9.弧形A

A rx ry x-axis-rotation large-arc-flag sweep-flag x y

以下是各參數的含義(可對照橢圓<ellipse />的參數含義):

rx ry :橢圓的兩個半軸的長度。
x-axis-rotation : 橢圓相對於座標系的旋轉角度,角度數而非弧度數。
large-arc-flag : 標記繪製大弧(1)還是小弧(0)部分。
sweep-flag : 標記向順時針(1)還是逆時針(0)方向繪製。
x y : 圓弧終點的座標。

<svg width="320px" height="320px">
  <path d="M10 315 L110 215 A30 50 0 0 1 162.55 162.45 L172.55 152.45 A30 50 -45 0 1 215.1 109.9 L315 10" stroke="black" fill="green" stroke-width="2" fill-opacity="0.5"/>
</svg>

如下圖:
這裏寫圖片描述

10.閉合路徑Z
這個就不用過多解釋了。在某些情況下使用Z命令可以省下寫L命令來閉合路徑。

SVG基本圖形的創建大概就這些,下一節我們聊聊SVG的動畫模塊,以及SVG動畫的內存回收。

四.參考資料

  1. SVG教程-MDN
  2. SVG -菜鳥教程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章