android矢量圖使用及踩坑記錄

一、由于png、jpg圖片占用內(nèi)存大,所以從android5.0開(kāi)始支持一種全新的矢量圖,svg格式的圖。這種圖優(yōu)勢(shì)大,占用內(nèi)存小,且縮放后依舊清晰。那么如何使用呢?

二、設(shè)計(jì)一般會(huì)給出png及svg格式的兩種圖,如果用png格式的話,建議先用tinyPng進(jìn)行壓縮后再使用,一般使用一套就可以了,不用每個(gè)分辨率下都放一套圖片。svg格式的圖就是矢量圖,導(dǎo)入as中是以xml文件形式存在的。導(dǎo)入步驟如下:

? ? ?右鍵點(diǎn)擊drawable文件夾 ---> 點(diǎn)擊new ---> 點(diǎn)擊Vector Asset ---> 出現(xiàn)下圖所示:

選擇Local file,Name處為自己對(duì)這個(gè)xml文件的命名,Path為本地路徑,即svg圖片所在的位置。如果選擇Override的話,則其Size默認(rèn)大小為svg本身的大小,也可以進(jìn)行按需更改。選擇Enable的話,則該矢量圖會(huì)在RTL布局中自動(dòng)鏡像。設(shè)置好后,點(diǎn)擊Next ---> 進(jìn)入下個(gè)頁(yè)面后點(diǎn)擊finsih即建好了一個(gè)矢量圖。示例:

<vector xmlns:android="http://schemas.android.com/apk/res/android"

? ? ? ? android:width="14dp"

? ? ? ? android:height="14dp"

? ? ? ? android:viewportWidth="14.0"

? ? ? ? android:viewportHeight="14.0">

? ? <path

? ? ? ? android:pathData="M2.151,0.535L13.465,11.849A1.143,1.143 112.734,0 1,13.465 13.465L13.465,13.465A1.143,1.143 112.734,0 1,11.849 13.465L0.535,2.151A1.143,1.143 117.322,0 1,0.535 0.535L0.535,0.535A1.143,1.143 117.322,0 1,2.151 0.535z"

? ? ? ? android:fillType="evenOdd"

? ? ? ? android:fillColor="#B9C0C7"/>

? ? <path

? ? ? ? android:pathData="M13.465,2.151L2.151,13.465A1.143,1.143 112.257,0 1,0.535 13.465L0.535,13.465A1.143,1.143 112.257,0 1,0.535 11.849L11.849,0.535A1.143,1.143 69.355,0 1,13.465 0.535L13.465,0.535A1.143,1.143 69.355,0 1,13.465 2.151z"

? ? ? ? android:fillType="evenOdd"

? ? ? ? android:fillColor="#B9C0C7"/>

</vector>

即為一個(gè)矢量圖。

三、導(dǎo)入矢量圖后如何使用呢?如果gradle版本比較低,可以直接使用,而不需要配置。只是,這時(shí)在高版本的android中矢量圖依舊為矢量圖,但在低版本中,矢量圖會(huì)轉(zhuǎn)化為各個(gè)分辨率下的png圖片。所以,最好進(jìn)行如下配置:

//在gradle2.0及以上:

android {

? defaultConfig {

? vectorDrawables.useSupportLibrary = true

}}

//在gradle 1.5以前

android {

? defaultConfig {

? ? // Stops the Gradle plugin’s automatic rasterization of vectors

? ? generatedDensities = []

? }

? // Flag to tell aapt to keep the attribute ids around

? aaptOptions {

? ? additionalParameters "--no-version-vectors"

? }

}

然后,在Application中設(shè)置:

if (Build.VERSION.SDK_INT < BuildInfo.LOLLIPOP) {

? ? AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); //支持SVG

}

四、如果所有的Activity繼承的是AppCompatActivity的話,不會(huì)有問(wèn)題。但如果繼承的是Activity,而且因?yàn)闃I(yè)務(wù)需求不可更改或者更改起來(lái)改動(dòng)太大,這時(shí),坑就來(lái)了。什么坑呢?比如,ImageView中setImageResource的是矢量圖,這時(shí)不會(huì)顯示出來(lái)任何圖片。如何更改?把ImageView換為AppCompatImageView即可,這是最簡(jiǎn)單的改法。還可以把矢量圖放到selector中,也可以在createview的時(shí)候進(jìn)行攔截,把ImageView轉(zhuǎn)為AppCompatImageView。

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

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

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