Android矢量圖VectorDrawable

** VectorDrawable** android5.0開始支持矢量圖神帅,它非常適合圖標(biāo),是獨(dú)立于屏幕密度的,一個(gè)文件適合所有屏幕婚陪。當(dāng)縮放的時(shí)候還可以保存所有的圖片質(zhì)量,通常文件所占用的空間也非常小使用VectorDrawable 可以大幅度的減少apk大小频祝。最新的AppCompat23.2庫通過使用VectorDrawableCompat可以支持在android api7+版本上使用矢量圖

矢量圖svg轉(zhuǎn)vectorDrawable

android并不支持web上的svg這種矢量圖片格式,而是以VectorDrawable的方式來實(shí)現(xiàn)矢量圖的效果泌参,因此我們需要自行轉(zhuǎn)換

轉(zhuǎn)換工具

項(xiàng)目中使用

  1. AppCompatImageView或者AppCompatImageButton或其子類,必須在app:srcCompat標(biāo)簽中使用
    • appcompat 23.2.0開始脆淹,提供了以上兩種支持庫一個(gè)用于兼容矢量圖,但是這個(gè)支持庫要使用的話,還得在app的gradle里面加個(gè)這樣的配置
//在gradle2.0及以上:
android {
  defaultConfig {
  vectorDrawables.useSupportLibrary = true
}}
* 代碼使用
<android.support.v7.widget.AppCompatImageView
       android:layout_width="42dp"
       android:layout_height="42dp"
       app:srcCompat="@drawable/icon_shopping"/>
  1. TextView button上使用
  • 項(xiàng)目中大量icon是用textview drawableLeft等屬性使用..
 <ImageView
         android:layout_width="16dp"
         android:layout_height="16dp"
         android:src="@drawable/aa_b_test" />
 <TextView
         android:layout_width="16dp"
         android:layout_height="16dp"
         android:drawableRight="@drawable/aa_b_test" />

高版本可以直接用drawable方式使用沽一,低版本需要包裹層StateListDrawable等實(shí)現(xiàn),且對(duì)應(yīng)activity加上句代碼盖溺,下個(gè)模塊會(huì)說明

兼容性解決

在Android 5.0之前(API level 21),Support Library 23.2或者更高的版本提供了矢量圖片和矢量圖片動(dòng)畫完整的支持铣缠。

  1. AnimatedVectorDrawableCompat通過兩個(gè)新的Support Libraries:support-vector-drawable和animated-vector-drawable分別進(jìn)行支持烘嘱;
    在你app模塊的build.gradle文件中添加vectorDrawables元素,使你的app使用矢量圖support library蝗蛙;
android {  
    ... ...  
    defaultConfig {  
        ... ...  
        vectorDrawables.useSupportLibrary = true  
    }  
    ... ...   
}

普通控件上使用Vector,就必須依附于StateListDrawable,InsetDrawable,LayerDrawable,LevelListDrawable,RotateDrawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/aa_b_test"/>
</selector>

同時(shí)activity中加以下代碼

   static {       
   AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
          }

有個(gè)坑就是該頁面activity需繼承自AppCompatActivity以支持compat兼容包屬性

  1. 我們也可以采用低版本構(gòu)建生成PNG圖片的兼容方式蝇庭;
    flight/build.gradle文件
apply plugin: 'com.android.library'  
android {  
    ... ...  
    aaptOptions {  
        additionalParameters "--no-version-vectors"  
    }  
    ... ...  
}  

性能

  1. 運(yùn)行時(shí)間
        long aaa = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            Resources res = getResources();
            Drawable drawable = res.getDrawable(R.drawable.aa_b_test);
            imageView.setImageDrawable(drawable);
        }
        Log.e("+++++++++++++++++", System.currentTimeMillis() - aaa + "++++++++++++");

結(jié)論是矢量圖4191 普通位圖3193

  1. size大小
    矢量圖:661字節(jié),
    位圖:一套圖(200*200)5kb捡硅,按項(xiàng)目要求4套大概10幾kb

總結(jié)

  1. 優(yōu)點(diǎn)
  • 圖片擴(kuò)展性:不損傷圖片質(zhì)量哮内,一套圖適配所有
  • 圖片大小:比使用位圖小十幾倍病曾,有利與減小apk size
  1. 缺點(diǎn)
  • 性能優(yōu)損失牍蜂,系統(tǒng)渲染VectorDrawable需要花費(fèi)更多時(shí)間,因?yàn)槭噶繄D的初始化加載會(huì)比相應(yīng)的光柵圖片消耗更多的CPU周期泰涂,但是兩者之間的內(nèi)存消耗和性能接近鲫竞。
  • 矢量圖主要用在色調(diào)單一的icon

可以只考慮在顯示小圖片的時(shí)候使用矢量圖(建議你限制矢量圖在200200dp)*

問題

Not supported SVG features

These SVG elements are not supported by VectorDrawable: patterns, masks, gradients, images, etc.
VectorDrawable fill-rule is always non-zero and cannot be changed prior to Android 7.0 (Nougat). If you end up with areas filled that should not be filled, that is because the SVG image was created using even-odd rule instead. There are three ways to deal with this problem: try specifying the --fix-fill-type option, manually edit SVGs in vector graphics software or convert for Android 7.0+.

所以svg轉(zhuǎn)換VectorDrawables時(shí)并不是100%還原,像我們遇到過luachicon會(huì)出現(xiàn)圓角丟失逼蒙。建議:單色調(diào)的icon使用矢量圖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末从绘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子是牢,更是在濱河造成了極大的恐慌僵井,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳棱,死亡現(xiàn)場(chǎng)離奇詭異批什,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)社搅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門驻债,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人形葬,你說我怎么就攤上這事合呐。” “怎么了笙以?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵淌实,是天一觀的道長。 經(jīng)常有香客問我,道長拆祈,這世上最難降的妖魔是什么恨闪? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮放坏,結(jié)果婚禮上凛剥,老公的妹妹穿的比我還像新娘。我一直安慰自己轻姿,他們只是感情好犁珠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著互亮,像睡著了一般犁享。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豹休,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天炊昆,我揣著相機(jī)與錄音,去河邊找鬼威根。 笑死凤巨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洛搀。 我是一名探鬼主播敢茁,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼留美!你這毒婦竟也來了彰檬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤谎砾,失蹤者是張志新(化名)和其女友劉穎逢倍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體景图,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡较雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挚币。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亮蒋。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忘晤,靈堂內(nèi)的尸體忽然破棺而出宛蚓,到底是詐尸還是另有隱情激捏,我是刑警寧澤设塔,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響闰蛔,放射性物質(zhì)發(fā)生泄漏痕钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一序六、第九天 我趴在偏房一處隱蔽的房頂上張望任连。 院中可真熱鬧,春花似錦例诀、人聲如沸随抠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拱她。三九已至,卻和暖如春扔罪,著一層夾襖步出監(jiān)牢的瞬間秉沼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工矿酵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唬复,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓全肮,卻偏偏與公主長得像敞咧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜腺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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