什么是矢量動畫吃谣?我們?yōu)楹我褂盟鼍担咳绾紊商雍簦亢蚐VG有什么區(qū)別?
一鳖孤、矢量圖SVG和VectorDrawable
1.1 SVG和Vector差異
- SVG----前端中使用,是一套有很多標簽的語法規(guī)范
- Vector----在Android中使用蜘渣,Vector只實現(xiàn)了SVG語法的Path標簽
1.2 Android不直接使用SVG的原因
SVG解析效率低下淌铐,Android只使用Path標簽去繪制圖形,語句復雜但是效率大大提升了蔫缸,和canvas理由類似腿准。同時,文件體積上拾碌,vector<svg<<png
1.3 Vector語法
pathData
標簽一般由字母跟數(shù)字組成吐葱,字母多為命令關鍵字(這里有個大小寫的區(qū)別,大寫的字母是基于原點坐標系的偏移量校翔,即絕對位置弟跑;小寫字母是基于當前點坐標系的偏移量,即相對位置)防症,數(shù)字多為坐標孟辑,
M(x y): 沒什么好說的,移動畫筆到指定點蔫敲,并不進行繪制饲嗽,默認在(0,0)點。與Paint里面moveTo可以理解成一樣的概念
L(l) (x y) : 畫直線奈嘿,與它類似的有H(h)
跟V(v)
貌虾。這里有一個方向的概念,pathData
中的方向與View繪制的方向是一樣的裙犹。H就是畫一條橫線尽狠,V就是畫一條豎線衔憨,L就是畫點到點之間的線
Z :沒有參數(shù),就是連接起點跟終點
二袄膏、生成矢量圖VectorDrawable
2.1 as自帶
- 右鍵res践图,選擇vector asset后選擇
2.2 svg導入
2.3 自己編寫
如下,其中android:viewportHeight
表示把寬高分成幾份,這樣在pathData
中可以用份數(shù)做單位沉馆,從而下次可以直接改寬高dp平项,而不用改pathData
<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="#dc33cdcd"
android:pathData="M100,100 L150,100 L150,150 L100,150 Z"/>
</vector>
效果圖就是一個青色的正方形:
三、VectorDrawable兼容性
3.1 兼容性的坎坷之路
- Android L (5.0)是它的誕生悍及,但是只允許API>=21的設備使用闽瓢,基本殘廢
- **Gradle Plugin 1.5 **是一個里程碑,設備>=21則使用vector心赶,設備<21則將vector在編譯時轉(zhuǎn)化為png使用扣讼,局限性很大
- AppCompat 23.2 才是真正的春天,靜態(tài)vector支持到android2.1+缨叫,動態(tài)vector支持到android3.0+椭符,于是幾乎兼容所有的設備
四、靜態(tài)VectorDrawable的配置與應用
4.1 gradle項目配置
- app子項目的
bulid.gradle
下添加一句話:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
確保
AppCompat
兼容庫版本為23.2以上同時更新根目錄下
bulid.gradle
中的**Gradle Plugin **版本耻姥,至少要升級到2.1以上销钝,否則還是會自動轉(zhuǎn)換vector為png(原因見3.1)
classpath 'com.android.tools.build:gradle:2.3.1'
4.2 控件使用vectorDrawable
4.2.1 ImageView/ImageButton
ImageView
/ImageButton
設置背景,直接用標簽app:srcCompat
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
app:srcCompat="@drawable/ic_camera"
/>
4.2.2 Button
Button
設置背景不能直接使用標簽app:srcCompat
琐簇,只能利用selector
標簽間接引用
-
selector
文件如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_rec" android:state_pressed="false"/>
<item android:drawable="@drawable/ic_camera" android:state_pressed="true"/>
</selector>
-
Button
設置背景為selector
:
<Button
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:layout_below="@id/camera_imageview"
android:background="@drawable/button_bg"/>
-
大坑注意
還要在代碼中加以下這句話:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
4.3 總結(jié)
使用低版本的手機進行實驗蒸健,若是顯示成功則說明配置成功了。
最終效果圖: