Android VectorDrawable與SVG

VectorDrawable
Android L開始提供了新的API VectorDrawable 可以使用SVG類型的資源,也就是矢量圖。在xml文件中的標(biāo)簽是<vector>,下面是一個例子

Paste_Image.png

這樣就定義好了一個靜態(tài)的矢量圖,可以像一般的圖片資源使用,設(shè)置到imageView中會顯示出一個心形??刂骑@示心形的就是上面path
這個標(biāo)簽,一個path
代表一個元素,繪制的內(nèi)容是pathData
下的一長串字符,里面是SVG繪制的一系列命令,提供moveTo、lineTo、close等操作,可以和Graphics 中的Path操作對應(yīng)起來,具體可以查看SVG path Ref,后面會簡要說明一下。 VectorDrawable
定義的是一張靜態(tài)圖,還有一個類AnimatedVectorDrawable
,可以讓矢量圖有動畫效果。一般需要三個步驟:

定義VectorDrawable


Paste_Image.png

定義AnimatedVectorDrawable,給上面矢量圖的元素添加動畫

Paste_Image.png

定義動畫文件

Paste_Image.png

由于矢量圖的特點,AnimatedVectorDawable
可以實現(xiàn)一些很特別的效果,對VectorDrawable里的pathData做動畫,可以從一個圖形漸變到另一個圖形,比如Material Design里的toolbar icon;對trimPathStart、trimPathEnd做動畫,可以得到圖形的繪制軌跡。
SVG Path Data
主要有以下一些命令
M: move to 移動繪制點
L:line to 直線
Z:close 閉合
C:cubic bezier 三次貝塞爾曲線
Q:quatratic bezier 二次貝塞爾曲線
A:ellipse 圓弧

每個命令都有大小寫形式,大寫代表后面的參數(shù)是絕對坐標(biāo),小寫表示相對坐標(biāo)。參數(shù)之間用空格或逗號隔開
命令詳解:
M (x y) 移動到x,y
L (x y) 直線連到x,y,還有簡化命令H(x) 水平連接、V(y)垂直連接
Z,沒有參數(shù),連接起點和終點
C(x1 y1 x2 y2 x y),控制點x1,y1 x2,y2,終點x,y
Q(x1 y1 x y),控制點x1,y1,終點x,y

A(rx ry x-axis-rotation large-arc-flag sweep-flag x y) rx ry 橢圓半徑 x-axis-rotation x軸旋轉(zhuǎn)角度 large-arc-flag 為0時表示取小弧度,1時取大弧度 sweep-flag 0取逆時針方向,1取順時針方向 有個圖解:

應(yīng)用
在github上看到一個VectorDrawable應(yīng)用的例子,實現(xiàn)了一個動態(tài)效果的searchbar,原理就是對VectorDrawable trimPathStart這個屬性做動畫。最初的設(shè)計在這里,照著實現(xiàn)一下:


Reference
https://developer.android.com/training/material/drawables.html
https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html
https://developer.android.com/reference/android/graphics/drawable/AnimatedVectorDrawable.html
http://www.w3.org/TR/SVG11/paths.html#PathData

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容