Android5.0之后 VectorDrawable實(shí)現(xiàn)超炫酷動畫效果

標(biāo)簽介紹:

<vector>, <group>, <clip-path>光涂,<animated-vector> 項(xiàng)目中還是用到了一些動畫的標(biāo)簽神汹,這里就不做展示了

path
android:name 定義該 path 的名字骄恶,這樣在其他地方可以通過名字來引用這個路徑
android:pathData 和 SVG 中 d 元素一樣的路徑信息席赂。
android:fillColor 定義填充路徑的顏色辖佣,如果沒有定義則不填充路徑
android:strokeColor 定義如何繪制路徑邊框匆帚,如果沒有定義則不顯示邊框
android:strokeWidth 定義路徑邊框的粗細(xì)尺寸
android:strokeAlpha 定義路徑邊框的透明度
android:fillAlpha 定義填充路徑顏色的透明度
android:trimPathStart 從路徑起始位置截?cái)嗦窂降谋嚷史湟铮≈捣秶鷱?0 到1
android:trimPathEnd 從路徑結(jié)束位置截?cái)嗦窂降谋嚷收け恚≈捣秶鷱?0 到1
android:trimPathOffset 設(shè)置路徑截取的范圍,取值范圍從 0 到1
android:strokeLineCap 設(shè)置路徑線帽的形狀师枣,取值為 butt, round, square.
android:strokeLineJoin 設(shè)置路徑交界處的連接方式怪瓶,取值為 miter,round,bevel.
android:strokeMiterLimit 設(shè)置斜角的上限文

vector:定義這個矢量圖
android:name 定義該drawable的名字
android:width 定義該 drawable 的內(nèi)部(intrinsic)寬度,支持所有 Android 系統(tǒng)支持的尺寸,通常使用 dp
android:height 定義該 drawable 的內(nèi)部(intrinsic)高度,支持所有 Android 系統(tǒng)支持的尺寸践美,通常使用 dp
android:viewportWidth 定義矢量圖視圖的寬度洗贰,視圖就是矢量圖 path 路徑數(shù)據(jù)所繪制的虛擬畫布
android:viewportHeight 定義矢量圖視圖的高度,視圖就是矢量圖 path 路徑數(shù)據(jù)所繪制的虛擬畫布
android:tint 定義該 drawable 的 tint 顏色陨倡。默認(rèn)是沒有 tint 顏色的
android:tintMode 定義 tint 顏色的 Porter-Duff blending 模式敛滋,默認(rèn)值為 src_inandroid:autoMirrored 設(shè)置當(dāng)系統(tǒng)為 RTL (right-to-left) 布局的時候,是否自動鏡像該圖片兴革。
android:alpha 該圖片的透明度屬性

首先創(chuàng)建一個vectorDrawable
先展示一下效果圖

</br>


登錄界面的vectorDrawable
現(xiàn)在看上去還是沒一點(diǎn)鳥用哈绎晃,也沒什么特點(diǎn)蜜唾,下一篇博客將給你驚喜,這里就不管它了

</br>
注意:這里寬高(width和height的比例及viewportHeight和viewportWidth比例)的比例很重要庶艾,這個比例必須和布局文件中寬高比例一直袁余,比如布局文件中的寬是300dp,高是100dp落竹,那么寬高的比例就是3:1,所以在vector中的寬高比例就是3:1

不要怪我啰嗦泌霍,因?yàn)槟闳绻粚?yīng),導(dǎo)致的直接結(jié)果就是顯示后的圖形是拉伸或是壓縮的述召,然后你可能會想朱转。我改一下就好了,那恭喜你你成功給自己挖了一個大坑积暖,全是計(jì)算

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="75dp"
    android:height="25dp"
    android:viewportHeight="40"
    android:viewportWidth="120">
        <path
            android:name="firstHLine"
            android:pathData="M 0,20 l 90,0"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
        <path
            android:name="circleTop"
            android:pathData="M 90,20
            A 9,9 0,1,0 81,11"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
        <path
            android:name="true"
            android:pathData="M 81,11 l 4,6 l 10,-8"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeLineCap="round"
            android:strokeWidth="0.5" />
        <path
            android:name="circleBouttom"
            android:pathData="
            M90,20
            A 9,9 0,1,1 90,38"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
        <path
            android:name="secondHLine"
            android:pathData="M 0,38 l 90,0"
            android:strokeAlpha="0.8"
            android:strokeColor="@android:color/holo_red_dark"
            android:strokeWidth="0.5" />
</vector>
沒錯我第一次看到vector的時候也是一臉懵逼藤为,這t m是啥呀,全是字母加數(shù)字夺刑,那就具體來解釋一下吧

</br>
vectorDrawable支持的指令:

M = moveto(M X,Y) :將畫筆移動到指定的坐標(biāo)位置
L = lineto(L X,Y) :畫直線到指定的坐標(biāo)位置
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):畫圓弧缅疟。分別對應(yīng): x軸半徑,y軸半徑遍愿,x軸偏移量存淫,弧度(0代表取小弧度,1代表取大弧度) 沼填,方向(0取逆時針桅咆,1為順時針),目標(biāo)X坐標(biāo)坞笙,目標(biāo)y坐標(biāo)岩饼。(當(dāng)rx=ry時就是一個圓,但是終點(diǎn)坐標(biāo)要對哈)

Z = closepath():關(guān)閉路徑

注意:這里字母大寫和字母小寫也是有講究的薛夜,大寫代表當(dāng)前空間的絕對位置籍茧,小寫代表相對位置,比如M(10,10)指的是移動到當(dāng)前空間的x=10,y= 10這個位置(絕對位置)梯澜,m(10,10)則指的是從當(dāng)前點(diǎn)向右10個單位位置的點(diǎn)寞冯,并從當(dāng)前點(diǎn)向下10個單位位置的點(diǎn)(相對位置)
這里提一下至于數(shù)字中間用逗號間隔,還是用空格來隔開都沒關(guān)系晚伙,根據(jù)個人喜好

測試大寫和小寫分別對應(yīng)的效果简十,代碼如下
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="100"
    android:viewportWidth="100">
    <path
        android:pathData="M 0,10,L 100,10"
        android:strokeColor="@android:color/holo_red_light"
        android:strokeWidth="2" />
    <path
        android:pathData="M 0,40,l 100,40"
        android:strokeColor="@android:color/holo_blue_light"
        android:strokeWidth="2" />
    <path
        android:pathData="M 0,80,L 100,80"
        android:strokeColor="@android:color/white"
        android:strokeWidth="2" />
</vector>
光文字,干燥撬腾,來張圖片螟蝙,醒醒腦
上面路徑對應(yīng)的圖

是不是一下感覺就懂了大小寫的區(qū)別了

接下來就來畫一些基本的圖形(直線就不畫了,上面有了)民傻,感受下vectorDrawable

先來畫個圓吧
漂亮吧

代碼如下

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24"
    android:viewportWidth="24">
    <path
        android:name="circle"
        android:pathData="
        M12,12//定位到當(dāng)前空間的中心
        m-10,0 //從當(dāng)前點(diǎn)向左移動10個單位
    a10,10 0 1,1 20,0//在當(dāng)前點(diǎn)繪制一個以上面的m點(diǎn)為起點(diǎn)半徑為10胰默,終點(diǎn)是(20,0)场斑,注意小寫是相對位置
        a10,10 0 1,1 -20,0"http://與上面同理
        android:strokeColor="@color/colorPrimary"
        android:strokeWidth="1" />
    <!--你可能會想為什么要畫兩個半圓而不是一個整圓,我只能說你可以試試-->
</vector>
再來個難度高點(diǎn)的
懵逼了吧
代碼如下
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="200"
    android:viewportWidth="200">
    <path
        android:fillColor="@color/colorAccent"
        android:pathData="
        M10,0
        h180//從當(dāng)前點(diǎn)向右一條直線牵署,繪制180個單位
        q10,0 10,10//這就是貝賽曲線
        v180//從當(dāng)前點(diǎn)向下一條直線漏隐,繪制180個單位
        q0,10 -10,10
        h -180
        q-10,0 -10,-10
        v-180
        q 0,-10 10,-10
        M 90,100
        a 30,40 -60,1,0 -60 ,10
        c 20,20 40,40 60,60
        c 20,-20 40,-40 60,-60//三次貝賽曲線
        a 30,40 60,1,0 -60 ,-10"
        android:strokeColor="@color/colorPrimary" />
</vector>

**貝賽曲線繪制很簡單的,但是實(shí)際用到比較少奴迅,我暫時就不做講解了青责,下一篇博客的文章末尾我會給出一些學(xué)習(xí)的鏈接
h和v方法是太簡單,讀者一試便知取具,就不繪制了
**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脖隶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暇检,更是在濱河造成了極大的恐慌产阱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块仆,死亡現(xiàn)場離奇詭異构蹬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悔据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門庄敛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人科汗,你說我怎么就攤上這事铐姚。” “怎么了肛捍?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長之众。 經(jīng)常有香客問我拙毫,道長,這世上最難降的妖魔是什么棺禾? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任缀蹄,我火速辦了婚禮,結(jié)果婚禮上膘婶,老公的妹妹穿的比我還像新娘缺前。我一直安慰自己,他們只是感情好悬襟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布衅码。 她就那樣靜靜地躺著,像睡著了一般脊岳。 火紅的嫁衣襯著肌膚如雪逝段。 梳的紋絲不亂的頭發(fā)上垛玻,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音奶躯,去河邊找鬼帚桩。 笑死,一個胖子當(dāng)著我的面吹牛嘹黔,可吹牛的內(nèi)容都是我干的账嚎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼儡蔓,長吁一口氣:“原來是場噩夢啊……” “哼郭蕉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浙值,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恳不,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后开呐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烟勋,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年筐付,在試婚紗的時候發(fā)現(xiàn)自己被綠了卵惦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓦戚,死狀恐怖沮尿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情较解,我是刑警寧澤畜疾,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站印衔,受9級特大地震影響啡捶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奸焙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一瞎暑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧与帆,春花似錦了赌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阵翎,卻和暖如春嫂拴,著一層夾襖步出監(jiān)牢的瞬間播揪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工筒狠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猪狈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓辩恼,卻偏偏與公主長得像雇庙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灶伊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,108評論 25 707
  • Android Vector曲折的兼容之路 兩年前寫書的時候疆前,就在研究Android L提出的Vector,可研究...
    eclipse_xu閱讀 34,983評論 30 263
  • 1. 矢量圖SVG簡介 Android 5.0系統(tǒng)中引入了 VectorDrawable 來支持矢量圖(SVG)聘萨,...
    登高且賦閱讀 2,588評論 2 15
  • 感賞自己情緒越來越穩(wěn)定竹椒,覺察力提升,可以與負(fù)面情緒很好的相處米辐。 感賞每天出門都能見證到豹子號胸完,小紅帽練習(xí)得到實(shí)現(xiàn)的...
    雨過天晴感悟閱讀 154評論 0 0
  • 忽然發(fā)現(xiàn)現(xiàn)在時刻想起的都是和他的回憶,而不是過去翘贮。 堵車赊窥,想起和他在岱山堵車;地鐵狸页,想起和他在上海的地鐵上锨能;看電視...
    不小不閱讀 146評論 0 0