rawable/abc_vector_test.xml from drawable resource ID #0x7f020052

在build.gradle文件中添加以下代碼:
aaptOptions {
additionalParameters "--no-version-vectors"
}

只兼容L+
Vector是在Android L中提出來(lái)的新概念,所以在剛開(kāi)始的時(shí)候是只兼容L+的。
####Gradle Plugin 1.5的兼容
從Gradle Plugin 1.5開(kāi)始犹撒,Google支持了一種兼容方式脚线,即在Android L之上檀训,使用Vector尝哆,而在L之下帕棉,則使用Gradle將Vector生成PNG圖像空盼。
Android gradle plugin 1.5發(fā)布以后,加入了一個(gè)跟VectorDrawable有關(guān)的新功能匙监。Android build tools 提供了另外一種解決兼容性的方案凡橱,如果編譯的版本是5.0之前的版本,那么build tools 會(huì)把VectorDrawable生成對(duì)應(yīng)的png圖片亭姥,這樣在5.0以下的版本則使用的是生成的png圖稼钩,而在5.0以上的版本中則使用VectorDrawable.在build.gradle添加generatedDensities配置,可以配置生成的png圖片的密度达罗。
####AppCompat23.2的兼容
從AppCompat23.2開(kāi)始坝撑,Google開(kāi)始支持在低版本上使用Vector。
*靜態(tài)Vector圖像
我們有很多方法能夠得到這些Vector粮揉,那么如何使用它們呢巡李,Android 5.0以上的使用就不講了,不太具有普遍代表性扶认,我們從pre-L版本的兼容開(kāi)始做起侨拦。
####pre-L版本兼容
VectorDrawableCompat依賴(lài)于AAPT的一些功能,它能保持最近矢量圖使用的添加的屬性ID辐宾,以便他們可以被pre-L版本之前的引用狱从。
在Android 5.0之前使用Vector,需要aapt來(lái)對(duì)資源進(jìn)行一些處理叠纹,這一過(guò)程可以在aapt的配置中進(jìn)行設(shè)置矫夯,如果沒(méi)有啟用這樣一個(gè)flag,那么在5.0以下的設(shè)備上運(yùn)行就會(huì)發(fā)生android.content.res.Resources$NotFoundException吊洼。
首先闷畸,你需要在項(xiàng)目的build.gradle腳本中臊泌,增加對(duì)Vector兼容性的支持,代碼如下所示:
使用Gradle Plugin 2.0以上:
Gradle<br>android {<br>defaultConfig {<br> vectorDrawables.useSupportLibrary = true<br>}<br>}<br>
使用Gradle Plugin 2.0以下,Gradle Plugin 1.5以上:
Gradle<br>android {<br>defaultConfig {<br>// Stops the Gradle plugin’s automatic rasterization of vectors<br>generatedDensities = []<br>}<br>// Flag to tell aapt to keep the attribute ids around<br>aaptOptions {<br>additionalParameters "--no-version-vectors"<br>}<br>}<br>
像前面提到的仲翎,這種兼容方式實(shí)際上是先關(guān)閉AAPT對(duì)pre-L版本使用Vector的妥協(xié),即在L版本以上薛窥,使用Vector味混,而在pre-L版本上,使用Gradle生成相應(yīng)的PNG圖片谬莹,generatedDensities這個(gè)數(shù)組檩奠,實(shí)際上就是要生成PNG的圖片分辨率的數(shù)組,使用appcompat后就不需要這樣了附帽。
當(dāng)然埠戳,最重要的還是添加appcompat的支持:
Gradle<br>compile 'com.android.support:appcompat-v7:23.4.0'<br>
>最低版本(如果之前是21, 后面還會(huì)引發(fā)新的坑):
compileSdkVersion 23
buildToolsVersion '23.0.3'
同時(shí),確保你使用的是AppCompatActivity而不是普通的Activity蕉扮。
####Vector圖像
一個(gè)基本的Vector圖像整胃,實(shí)際上也是一個(gè)xml文件,如下所示:
Xml<br><vector xmlns:android="http://schemas.android.com/apk/res/android"<br> android:width="200dp"<br> android:height="200dp"<br> android:viewportHeight="500"<br> android:viewportWidth="500"><br><path<br> android:name="square"<br> android:fillColor="#000000"<br> android:pathData="M100,100 L400,100 L400,400 L100,400 z" /><br></vector><br>
顯示如圖所示:(略)
這里需要解釋下這里的幾個(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)。
android:fillColor:PathData中的這些屬性就不詳細(xì)講了疾呻,與Canvas繪圖的屬性基本類(lèi)似除嘹。
####在控件中使用
有了靜態(tài)的Vector圖像,就可以在控件中使用了岸蜗。
可以發(fā)現(xiàn)尉咕,這里我們使用的都是普通的ImageView,好像并不是AppcomatImageView璃岳,這是因?yàn)槭褂昧薃ppcomat后年缎,系統(tǒng)會(huì)自動(dòng)把ImageView轉(zhuǎn)換為AppcomatImageView。
#####ImageView/ImageButton
對(duì)于ImageView這樣的控件铃慷,要兼容Vector圖像单芜,只需要將之前的android:src屬性,換成app:srcCompat即可犁柜,示例代碼如下所示:
Xml<br><ImageView<br> android:id="@+id/iv"<br> android:layout_width="wrap_content"<br> android:layout_height="wrap_content"<br> app:srcCompat="@drawable/vector_image" /><br>
在代碼中設(shè)置的話(huà)洲鸠,代碼如下所示:
Java<br>ImageView iv = (ImageView) findViewById(R.id.iv);<br>iv.setImageResource(R.drawable.vector_image);<br>// setBackgroundResource也是可以設(shè)置Vector的API<br>
#####Button
Button并不能直接使用app:srcCompat來(lái)使用Vector圖像,需要通過(guò)Selector來(lái)進(jìn)行使用,首先扒腕,創(chuàng)建兩個(gè)圖像绢淀,用于Selector的兩個(gè)狀態(tài),代碼如下所示:
selector1.xml
Xml<br><vector xmlns:android="http://schemas.android.com/apk/res/android"<br> android:width="24dp"<br> android:height="24dp"<br> android:viewportHeight="24.0"<br> android:viewportWidth="24.0"><br><path<br> android:fillColor="#FF000000"<br> android:pathData="M14.59,8L12,10.59 9.41,8 8,9.41 10.59,12 8,14.59 9.41,16 12,13.41 14.59,16 16,14.59 13.41,12 16,9.41 14.59,8zM12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z" /><br></vector><br>
selector2.xml
Xml<br><vector xmlns:android="http://schemas.android.com/apk/res/android"<br> android:width="24dp"<br> android:height="24dp"<br> android:viewportHeight="24.0"<br> android:viewportWidth="24.0"><br><path<br> android:fillColor="#FF000000"<br> android:pathData="M11,15h2v2h-2zM11,7h2v6h-2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /><br></vector><br>
selector.xml
Xml<br><?xml version="1.0" encoding="utf-8"?><br><selector xmlns:android="http://schemas.android.com/apk/res/android"><br><item android:drawable="@drawable/selector1" android:state_pressed="true" /><br><item android:drawable="@drawable/selector2" /><br></selector><br>
非常簡(jiǎn)單瘾腰,只是把普通的Selector中的圖像換成了Vector圖像而已皆的,接下來(lái),在Button中使用這個(gè)Selector即可:
Xml<br><Button<br> android:id="@+id/btn"<br> android:layout_width="70dp"<br> android:layout_height="70dp"<br> android:background="@drawable/selector" /><br>
然后運(yùn)行蹋盆,如果你認(rèn)為可以運(yùn)行费薄,那就是太天真了,都說(shuō)了是兼容栖雾,怎么能沒(méi)有坑呢楞抡,這里就是一個(gè)坑……
這個(gè)坑實(shí)際上是有歷史淵源的,Google的一位開(kāi)發(fā)者在博客中寫(xiě)到:
>First up, this functionality was originally released in 23.2.0, but then we found some memory usage and Configuration updating issues so we it removed in 23.3.0. In 23.4.0 (technically a fix release) we’ve re-added the same functionality but behind a flag which you need to manually enable.
實(shí)際上岩灭,他們的這個(gè)改動(dòng)拌倍,就影響了類(lèi)似DrawableContainers(DrawableContainers which reference other drawables resources which contain only a vector resource)這樣的類(lèi),它的一個(gè)典型噪径,就是Selector(StateListDrawable也是)柱恤。這個(gè)開(kāi)發(fā)者在文中提到的flag,就是下面的這段代碼找爱,放在Activity的前面就可以了:
Java<br>static {<br>AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);<br>}<br>
開(kāi)啟這個(gè)flag后梗顺,你就可以正常使用Selector這樣的DrawableContainers了。同時(shí)车摄,你還開(kāi)啟了類(lèi)似android:drawableLeft這樣的compound drawable的使用權(quán)限寺谤,以及RadioButton的使用權(quán)限,以及ImageView’s src屬性吮播。
#####RadioButton
RadioButton的Button同樣可以定義变屁,代碼如下所示:
Xml<br><RadioButton<br> android:layout_width="50dp"<br> android:layout_height="50dp"<br> android:button="@drawable/selector" /><br>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市意狠,隨后出現(xiàn)的幾起案子粟关,更是在濱河造成了極大的恐慌,老刑警劉巖环戈,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷板,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡院塞,警方通過(guò)查閱死者的電腦和手機(jī)遮晚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拦止,“玉大人县遣,你說(shuō)我怎么就攤上這事。” “怎么了艺玲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵括蝠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我饭聚,道長(zhǎng),這世上最難降的妖魔是什么搁拙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任秒梳,我火速辦了婚禮,結(jié)果婚禮上箕速,老公的妹妹穿的比我還像新娘酪碘。我一直安慰自己,他們只是感情好盐茎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布兴垦。 她就那樣靜靜地躺著,像睡著了一般字柠。 火紅的嫁衣襯著肌膚如雪探越。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天窑业,我揣著相機(jī)與錄音钦幔,去河邊找鬼。 笑死常柄,一個(gè)胖子當(dāng)著我的面吹牛鲤氢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播西潘,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卷玉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了喷市?” 一聲冷哼從身側(cè)響起相种,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎东抹,沒(méi)想到半個(gè)月后蚂子,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缭黔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年食茎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馏谨。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡别渔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哎媚,我是刑警寧澤喇伯,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拨与,受9級(jí)特大地震影響稻据,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜买喧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一捻悯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淤毛,春花似錦今缚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔗蹋,卻和暖如春何荚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纸颜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工兽泣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胁孙。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓唠倦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涮较。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稠鼻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • Android Vector曲折的兼容之路 兩年前寫(xiě)書(shū)的時(shí)候,就在研究Android L提出的Vector狂票,可研究...
    eclipse_xu閱讀 35,021評(píng)論 30 263
  • 今天我在看某腦SVG視頻和網(wǎng)上查資料時(shí)候齿,發(fā)現(xiàn)了和某位大佬的寫(xiě)文章的某種巧合(報(bào)以微妙的笑容)。因?yàn)閺?qiáng)迫癥闺属,所以我想...
    仁昌居士閱讀 4,685評(píng)論 0 11
  • 用兩張圖告訴你慌盯,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,749評(píng)論 2 59
  • 會(huì)議上掂器,產(chǎn)品經(jīng)理突然眼里閃爍著一絲詭異的光亚皂,隨后提出一個(gè)需求:Android的屏幕適配要從320X480的尺寸開(kāi)始...
    AxeChen閱讀 2,078評(píng)論 2 38
  • 使用FragmentTabHost+Fragment實(shí)現(xiàn)底部菜單,AS運(yùn)行項(xiàng)目之后国瓮,報(bào)錯(cuò):android.cont...
    AR7_閱讀 4,329評(píng)論 0 0