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

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

只兼容L+
Vector是在Android L中提出來的新概念,所以在剛開始的時(shí)候是只兼容L+的。
####Gradle Plugin 1.5的兼容
從Gradle Plugin 1.5開始,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開始,Google開始支持在低版本上使用Vector。
*靜態(tài)Vector圖像
我們有很多方法能夠得到這些Vector,那么如何使用它們呢,Android 5.0以上的使用就不講了,不太具有普遍代表性,我們從pre-L版本的兼容開始做起。
####pre-L版本兼容
VectorDrawableCompat依賴于AAPT的一些功能,它能保持最近矢量圖使用的添加的屬性ID,以便他們可以被pre-L版本之前的引用。
在Android 5.0之前使用Vector,需要aapt來對(duì)資源進(jìn)行一些處理,這一過程可以在aapt的配置中進(jìn)行設(shè)置,如果沒有啟用這樣一個(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繪圖的屬性基本類似。
####在控件中使用
有了靜態(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è)置的話,代碼如下所示:
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來使用Vector圖像,需要通過Selector來進(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圖像而已,接下來,在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)行,那就是太天真了,都說了是兼容,怎么能沒有坑呢,這里就是一個(gè)坑……
這個(gè)坑實(shí)際上是有歷史淵源的,Google的一位開發(fā)者在博客中寫到:
>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),就影響了類似DrawableContainers(DrawableContainers which reference other drawables resources which contain only a vector resource)這樣的類,它的一個(gè)典型,就是Selector(StateListDrawable也是)。這個(gè)開發(fā)者在文中提到的flag,就是下面的這段代碼,放在Activity的前面就可以了:
Java<br>static {<br>AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);<br>}<br>
開啟這個(gè)flag后,你就可以正常使用Selector這樣的DrawableContainers了。同時(shí),你還開啟了類似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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評(píng)論 3 422
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,960評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,914評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,089評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,340評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評(píng)論 1 289
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,834評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,106評(píng)論 2 375

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