矢量圖形SVG&高級(jí)動(dòng)畫(huà)

引導(dǎo):

微信引入的SVG技術(shù)夕晓。

概念:

首先要解釋下什么是矢量圖像烤惊,什么是位圖圖像?

1吁朦、矢量圖像:SVG是W3C 推出的一種開(kāi)放標(biāo)準(zhǔn)的文本式矢量圖形描述語(yǔ)言,他是基于XML的柒室、專(zhuān)門(mén)為網(wǎng)絡(luò)而設(shè)計(jì)的圖像格式,SVG是一種采用XML來(lái)描述二維圖形的語(yǔ)言逗宜,所以它可以直接打開(kāi)xml文件來(lái)修改和編輯雄右。

2空骚、位圖圖像:位圖圖像的存儲(chǔ)單位是圖像上每一點(diǎn)的像素值,因而文件會(huì)比較大擂仍,像GIF囤屹、JPEG、PNG等都是位圖圖像格式逢渔。

  • 2)Vector肋坚,在Android中指的是Vector Drawable,也就是Android中的矢量圖肃廓,
    可以說(shuō)Vector就是Android中的SVG實(shí)現(xiàn)(并不是支持全部的SVG語(yǔ)法,現(xiàn)已支持的完全足夠用了)

補(bǔ)充:Vector圖像剛發(fā)布的時(shí)候智厌,是只支持Android 5.0+的,自從AppCompat 23.2之后盲赊,Vector可以使用于Android 2.1以上的所有系統(tǒng)铣鹏,只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了。(所謂的兼容也是個(gè)坑爹的兼容哀蘑,即低版本非真實(shí)使用SVG,而是生成PNG圖片)

Vector Drawable:

Android 5.0發(fā)布的時(shí)候诚卸,Google提供了Vector的支持,即:Vector Drawable類(lèi)绘迁。

Vector Drawable相對(duì)于普通的Drawable來(lái)說(shuō)合溺,有以下幾個(gè)好處:

  • (1)Vector圖像可以自動(dòng)進(jìn)行適配,不需要通過(guò)分辨率來(lái)設(shè)置不同的圖片脊髓。
  • (2)Vector圖像可以大幅減少圖像的體積辫愉,同樣一張圖栅受,用Vector來(lái)實(shí)現(xiàn)将硝,可能只有PNG的幾十分之一。
  • (3)使用簡(jiǎn)單屏镊,很多設(shè)計(jì)工具依疼,都可以直接導(dǎo)出SVG圖像,從而轉(zhuǎn)換成Vector圖像 功能強(qiáng)大而芥。
  • (4)不用寫(xiě)很多代碼就可以實(shí)現(xiàn)非常復(fù)雜的動(dòng)畫(huà) 成熟律罢、穩(wěn)定,前端已經(jīng)非常廣泛的進(jìn)行使用了棍丐。

1) Vector 語(yǔ)法簡(jiǎn)介

通過(guò)使用它的Path標(biāo)簽误辑,幾乎可以實(shí)現(xiàn)SVG中的其它所有標(biāo)簽,雖然可能會(huì)復(fù)雜一點(diǎn)歌逢,
但這些東西都是可以通過(guò)工具來(lái)完成的巾钉,所以,不用擔(dān)心寫(xiě)起來(lái)會(huì)很復(fù)雜秘案。

(1)Path指令解析如下所示:

M = moveto(M X,Y) :將畫(huà)筆移動(dòng)到指定的坐標(biāo)位置砰苍,相當(dāng)于 android Path 里的moveTo()
L = lineto(L X,Y) :畫(huà)直線到指定的坐標(biāo)位置潦匈,相當(dāng)于 android Path 里的lineTo()
H = horizontal lineto(H X):畫(huà)水平線到指定的X坐標(biāo)位置 
V = vertical lineto(V Y):畫(huà)垂直線到指定的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)閉路徑(會(huì)自動(dòng)繪制連接起點(diǎn)和終點(diǎn))

注意,’M’處理時(shí)吼旧,只是移動(dòng)了畫(huà)筆凰锡, 沒(méi)有畫(huà)任何東西。

注意:

1.關(guān)于這些語(yǔ)法圈暗,開(kāi)發(fā)者不需要全部精通寡夹,而是能夠看懂即可,這些path標(biāo)簽及數(shù)據(jù)生成都可以交給工具來(lái)實(shí)現(xiàn)厂置。(一般美工來(lái)幫你搞定菩掏!PS、Illustrator等等都支持導(dǎo)出SVG圖片)

2.程序員:沒(méi)必要去學(xué)習(xí)使用這些設(shè)計(jì)工具昵济,開(kāi)發(fā)者可以利用一些工具智绸,自己轉(zhuǎn)換一些比較基礎(chǔ)的圖像,
    如:http://inloop.github.io/svg2android/ 
3.還可以使用SVG的編輯器來(lái)進(jìn)行SVG圖像的編寫(xiě)访忿,例如:http://editor.method.ac/
(絕配瞧栗!可以先用http://editor.method.ac/ 生成SVG圖片,然后用http://inloop.github.io/svg2android/ 生成 VectorDrawable xml代碼)
4.使用AndroidStudio插件完成SVG添加(Vector Asset Studio)
    詳細(xì):http://www.reibang.com/p/d6c39f2dd5e7
    AS會(huì)自動(dòng)生成兼容性圖片(高版本會(huì)生成xxx.xml的SVG圖片海铆;低版本會(huì)自動(dòng)生成xxx.png圖片)
5.有些網(wǎng)站可以找到SVG資源
    SVG下載地址: http://www.shejidaren.com/8000-flat-icons.html
                  http://www.flaticon.com/

靜態(tài)Vector圖像

1)生成圖片
例如: 我們用as生成的一個(gè)圖片如下:

<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>

和 (一個(gè)矩形)

<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>

解釋頭部的幾個(gè)標(biāo)簽:

android:width \ android:height:定義圖片的寬高android:viewportHeight\ android:viewportWidth:定義圖像被劃分的比例大小迹恐,例如例子中的500,即把200dp大小的圖像劃分成500份卧斟,后面Path標(biāo)簽中的坐標(biāo)殴边,就全部使用的是這里劃分后的坐標(biāo)系統(tǒng)。
這樣做有一個(gè)非常好的作用珍语,就是將圖像大小與圖像分離锤岸,后面可以隨意修改圖像大小,而不需要修改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(寫(xiě)兩個(gè)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.動(dòng)態(tài)Vector

動(dòng)態(tài)Vector才是Android Vector Drawable的精髓所在
animated-vector: 只能5.+才能使用5懊!
如果是兩個(gè)SVG進(jìn)行動(dòng)畫(huà)放接,要注意兩個(gè)SVG的節(jié)點(diǎn)一定要一樣多(命令數(shù)要一樣)

5.VectorDrawable的性能問(wèn)題:

1)Bitmap的繪制效率并不一定會(huì)比Vector高刺啦,它們有一定的平衡點(diǎn),當(dāng)Vector比較簡(jiǎn)單時(shí)透乾,其效率是一定比Bitmap高的洪燥,所以磕秤,為了保證Vector的高效率,Vector需要更加簡(jiǎn)單捧韵,PathData更加標(biāo)準(zhǔn)市咆、精簡(jiǎn),當(dāng)Vector圖像變得非常復(fù)雜時(shí)再来,就需要使用Bitmap來(lái)代替了

2)Vector適用于ICON蒙兰、Button、ImageView的圖標(biāo)等小的ICON芒篷,或者是需要的動(dòng)畫(huà)效果搜变,由于Bitmap在GPU中有緩存功能,而Vector并沒(méi)有针炉,所以Vector圖像不能做頻繁的重繪

3)Vector圖像過(guò)于復(fù)雜時(shí)挠他,不僅僅要注意繪制效率,初始化效率也是需要考慮的重要因素

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篡帕,一起剝皮案震驚了整個(gè)濱河市殖侵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镰烧,老刑警劉巖拢军,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怔鳖,居然都是意外死亡茉唉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)结执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)度陆,“玉大人,你說(shuō)我怎么就攤上這事昌犹〖嵛撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵斜姥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沧竟,道長(zhǎng)铸敏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任悟泵,我火速辦了婚禮杈笔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糕非。我一直安慰自己蒙具,他們只是感情好球榆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著禁筏,像睡著了一般持钉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篱昔,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天每强,我揣著相機(jī)與錄音,去河邊找鬼州刽。 笑死空执,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穗椅。 我是一名探鬼主播辨绊,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匹表!你這毒婦竟也來(lái)了邢羔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤桑孩,失蹤者是張志新(化名)和其女友劉穎拜鹤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體流椒,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敏簿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宣虾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惯裕。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绣硝,靈堂內(nèi)的尸體忽然破棺而出蜻势,到底是詐尸還是另有隱情,我是刑警寧澤鹉胖,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布握玛,位于F島的核電站,受9級(jí)特大地震影響甫菠,放射性物質(zhì)發(fā)生泄漏挠铲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一寂诱、第九天 我趴在偏房一處隱蔽的房頂上張望拂苹。 院中可真熱鬧,春花似錦痰洒、人聲如沸瓢棒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脯宿。三九已至念颈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗅绰,已是汗流浹背舍肠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窘面,地道東北人翠语。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像财边,于是被迫代替她去往敵國(guó)和親肌括。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容