SVG
引導(dǎo):微信引入的SVG技術(shù)。
http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207863967&idx=1&sn=3d7b07d528f38e9f812e8df7df1e3322&scene=4#wechat_redirect
1.概念
1)SVG,即Scalable Vector Graphics 可伸縮矢量圖形,這種圖像格式在前端中已經(jīng)使用的非常廣泛了。
SVG的W3C的解釋: http://www.w3school.com.cn/svg/svg_intro.asp
首先要解釋下什么是矢量圖像,什么是位圖圖像?
1、矢量圖像:SVG是W3C 推出的一種開放標(biāo)準(zhǔn)的文本式矢量圖形描述語言,他是基于XML的、專門為網(wǎng)絡(luò)而設(shè)計的圖像格式,
SVG是一種采用XML來描述二維圖形的語言,所以它可以直接打開xml文件來修改和編輯。
2、位圖圖像:位圖圖像的存儲單位是圖像上每一點的像素值,因而文件會比較大,像GIF、JPEG、PNG等都是位圖圖像格式。
2)Vector,在Android中指的是Vector Drawable,也就是Android中的矢量圖,
可以說Vector就是Android中的SVG實現(xiàn)(并不是支持全部的SVG語法,現(xiàn)已支持的完全足夠用了)
補充:Vector圖像剛發(fā)布的時候,是只支持Android 5.0+的,自從AppCompat 23.2之后,Vector可以使用于Android 2.1以上的所有系統(tǒng),
只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了。(所謂的兼容也是個坑爹的兼容,即低版本非真實使用SVG,而是生成PNG圖片)
2.Vector Drawable:
Android 5.0發(fā)布的時候,Google提供了Vector的支持,即:Vector Drawable類。
Vector Drawable相對于普通的Drawable來說,有以下幾個好處:
(1)Vector圖像可以自動進行適配,不需要通過分辨率來設(shè)置不同的圖片。
(2)Vector圖像可以大幅減少圖像的體積,同樣一張圖,用Vector來實現(xiàn),可能只有PNG的幾十分之一。
(3)使用簡單,很多設(shè)計工具,都可以直接導(dǎo)出SVG圖像,從而轉(zhuǎn)換成Vector圖像 功能強大。
(4)不用寫很多代碼就可以實現(xiàn)非常復(fù)雜的動畫 成熟、穩(wěn)定,前端已經(jīng)非常廣泛的進行使用了。
Vector 語法簡介
通過使用它的Path標(biāo)簽,幾乎可以實現(xiàn)SVG中的其它所有標(biāo)簽,雖然可能會復(fù)雜一點,
但這些東西都是可以通過工具來完成的,所以,不用擔(dān)心寫起來會很復(fù)雜。
(1)Path指令解析如下所示:
M = moveto(M X,Y) :將畫筆移動到指定的坐標(biāo)位置,相當(dāng)于 android Path 里的moveTo()
L = lineto(L X,Y) :畫直線到指定的坐標(biāo)位置,相當(dāng)于 android Path 里的lineTo()
H = horizontal lineto(H X):畫水平線到指定的X坐標(biāo)位置
V = vertical lineto(V Y):畫垂直線到指定的Y坐標(biāo)位置
C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY):三次貝賽曲線
S = smooth curveto(S X2,Y2,ENDX,ENDY) 同樣三次貝塞爾曲線,更平滑
Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY):二次貝賽曲線
T = smooth quadratic Belzier curveto(T ENDX,ENDY):映射 同樣二次貝塞爾曲線,更平滑
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧線 ,相當(dāng)于arcTo()
Z = closepath():關(guān)閉路徑(會自動繪制連接起點和終點)
注意,’M’處理時,只是移動了畫筆, 沒有畫任何東西。
注意:1.關(guān)于這些語法,開發(fā)者不需要全部精通,而是能夠看懂即可,這些path標(biāo)簽及數(shù)據(jù)生成都可以交給工具來實現(xiàn)。
(一般美工來幫你搞定!PS、Illustrator等等都支持導(dǎo)出SVG圖片)
2.程序員:沒必要去學(xué)習(xí)使用這些設(shè)計工具,開發(fā)者可以利用一些工具,自己轉(zhuǎn)換一些比較基礎(chǔ)的圖像,
如:http://inloop.github.io/svg2android/
3.還可以使用SVG的編輯器來進行SVG圖像的編寫,例如:http://editor.method.ac/
(絕配!可以先用http://editor.method.ac/ 生成SVG圖片,然后用http://inloop.github.io/svg2android/ 生成 VectorDrawable xml代碼)
4.使用AndroidStudio插件完成SVG添加(Vector Asset Studio)
詳細:http://www.itdecent.cn/p/d6c39f2dd5e7
AS會自動生成兼容性圖片(高版本會生成xxx.xml的SVG圖片;低版本會自動生成xxx.png圖片)
5.有些網(wǎng)站可以找到SVG資源
SVG下載地址: http://www.shejidaren.com/8000-flat-icons.html
http://www.flaticon.com/
3.靜態(tài)Vector圖像
1)生成圖片
例如: 我們用as生成的一個圖片如下:
<vector android:alpha="0.78" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z"/>
</vector>
和 (一個矩形)
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportHeight="500"
android:viewportWidth="500">
<path
android:name="square"
android:fillColor="#000000"
android:pathData="M100,100 L400,100 L400,400 L100,400 z"/>
</vector>
解釋頭部的幾個標(biāo)簽:
android:width \ android:height:定義圖片的寬高
android:viewportHeight \ android:viewportWidth:定義圖像被劃分的比例大小,例如例子中的500,即把200dp大小的圖像劃分成500份,后面Path標(biāo)簽中的坐標(biāo),就全部使用的是這里劃分后的坐標(biāo)系統(tǒng)。
這樣做有一個非常好的作用,就是將圖像大小與圖像分離,后面可以隨意修改圖像大小,而不需要修改PathData中的坐標(biāo)。
2)使用圖片,就當(dāng)普通的圖片使用就可以了。
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:src="@drawable/vector_image"/>
或者代碼設(shè)置:
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageResource(R.drawable.vector_image);
iv.setBackgroundResource(R.drawable.vector_image)
如果是Button,可以設(shè)置selector(寫兩個SVG的Drawable)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/selector1" android:state_pressed="true"/>
<item android:drawable="@drawable/selector2"/>
</selector>
4.動態(tài)Vector
動態(tài)Vector才是Android Vector Drawable的精髓所在
animated-vector: 只能5.+才能使用!!
如果是兩個SVG進行動畫,要注意兩個SVG的節(jié)點一定要一樣多(命令數(shù)要一樣)
5.VectorDrawable的性能問題:
1)Bitmap的繪制效率并不一定會比Vector高,它們有一定的平衡點,當(dāng)Vector比較簡單時,其效率是一定比Bitmap高的,所以,為了保證Vector的高效率,Vector需要更加簡單,PathData更加標(biāo)準(zhǔn)、精簡,當(dāng)Vector圖像變得非常復(fù)雜時,就需要使用Bitmap來代替了
2)Vector適用于ICON、Button、ImageView的圖標(biāo)等小的ICON,或者是需要的動畫效果,由于Bitmap在GPU中有緩存功能,而Vector并沒有,所以Vector圖像不能做頻繁的重繪
3)Vector圖像過于復(fù)雜時,不僅僅要注意繪制效率,初始化效率也是需要考慮的重要因素