譯 在 Android 應用中使用向量資源

2021-09-24 08:31:55 字數 3565 閱讀 1587

譯文出自:掘金翻譯計畫

譯者:yueyong

校對者:rickon,tuaran

從 lollipop 開始,你可以在任何需要使用其他可繪製型別的地方使用vectordrawables(使用標準的@drawable/foo語法引用它們),但是我建議始終使用 androidx 實現。

這會顯著增加其使用平台的範圍,不僅如此,它還支援將特性和 bug 修復程式向後移植到舊平台。例如,使用 androidx 中的vectordrawablecompat可以:

基於這些原因,你應該始終使用 androidx,即使你很幸運地將你的minsdkversion設定成 24。這沒什麼不好的,如果/當vectordrawable在未來擴充套件了新的功能,並且它們也被新增到 androidx 中,那麼它們就可以直接使用,而不需要重新檢查**。

alex lockwood是這麼說的

為了使用 androidx 向量支援(androidx vector support),你需要做 2 件事情:

您需要在應用的build.gradle中選擇加入androidx向量支援:

android 

}複製**

如果minsdkversion< 21,這意味著 android gradle 外掛程式無法生成向量資源的 png 版本 —— 如果我們使用 androidx 庫的話就不用擔心這個問題。

通過預設的 aapt(android 資產包裝工具)版本資源。它也被傳遞給構建工具鏈。這意味著,如果你在res/drawable/中宣告乙個vectordrawable,它會為你將其自動移動到res/drawable-v21/,因為系統知道這就是vectordrawable類被引入的時候。

這可以防止屬性 id 衝突 —— 在vectordrawables中使用的屬性(android:pathdataandroid:fillcolor等)都有乙個整數 id,這些 id 是在 api 21 中新增的。在老版本的 android 上,沒有任何東西可以阻止 oem 使用任何"無人認領」的 id,因此在較老的平台上使用較新的屬性是不安全的。

imageviewimagebutton

checkboxradiobutton:):

這些要求會影響你建立布局或訪問資源所使用的方式。以下是一些考慮到的實際因素。

不幸的是,有很多地方你可能想要在不提供 compat 屬性的檢視上指定 drawables(例如,對於progressbar來說沒有indeterminatedrawablecompat屬性)。你仍然可以使用 androidx vectors,但你需要對**作如下更改:

spdx-license-identifier: apache-2.0 */

val progressbar = findviewbyid(r.id.loading)

progressbar.indeterminatedrawable = drawable

複製**

如果您正在使用資料繫結,那麼可以使用自定義繫結介面卡來完成此操作:

spdx-license-identifier: apache-2.0 */

@bindingadapter("indeterminatedrawablecompat")

fun bindindeterminateprogress(progressbar: progressbar, @drawableres id: int)

複製**

spdx-license-identifier: apache-2.0 -->

type="your.package.r"

alias="r" />

...複製**

向後移植(譯者注:原文是 back-ported ,wikipedia 上解釋是把新版本上的東西移植到老版本上去,這裡翻譯成向後移植)。這是statelistdrawable的乙個版本,具有狀態之間的動畫轉換(以animatedvectordrawables的形式)。你不需要申明乙個過渡。因此,如果你只需要乙個可以使用 androidx 來擴充子向量的statelistdrawable,那麼你可以使用:

spdx-license-identifier: apache-2.0 -->

"true" android:drawable="@drawable/some_vector" />

"@drawable/some_other_vector" />

複製**

一切都歸功於這個天才黑客: twitter.com/alexjlockwo…

有時你需要在無法控制何時或如何載入的地方使用 drawable。例如:通知,主螢幕小部件或主題中指定的某些資源(例如,在建立預覽視窗時設定由平台載入的android:windowbackground)。在這些情況下,你不負責載入 drawable,因此沒有機會整合 androidx 支援,你也就無法在 api 21 之前使用這些向量資源了?。

res/

drawable-xxhdpi/

foo.png <-- raster

drawable-anydpi-v21/

foo.xml <-- vector

drawable-anydpi-v24/

foo.xml <-- vector with fancy features

複製**

請注意,除了 api 級別限定符之外,我們還需要在此處包含anydpi資源限定符。這是由於資源限定符優先順序的工作方式導致的。任何在drawable- dpi中的資源都被認為是比在drawable-v21更好的選擇。

本文旨在強調使用 androidx 向量支援(androidx vector support)的好處以及一些你需要注意的限制。使用 androidx 支援既可以在更多平台版本和後端功能上使用向量資源,也可以讓你接收任何未來的更新。

即將推出:為 android 建立向量資源

即將推出:android vectordrawables分析

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計畫 對譯文進行修改並 pr,也可獲得相應獎勵積分。文章開頭的本文永久鏈結即為本文在 github 上的 markdown 鏈結。

譯 在 Android 應用中使用向量資源

譯文出自 掘金翻譯計畫 譯者 yueyong 校對者 rickon,tuaran 從 lollipop 開始,你可以在任何需要使用其他可繪製型別的地方使用vectordrawables 使用標準的 drawable foo語法引用它們 但是我建議始終使用 androidx 實現。這會顯著增加其使用平...

譯 在C 中使用LINQ To SQL

譯文出處 今天在這個話題中,我給大家分享乙個在c 程式設計中非常有趣和十分有用的特性。說明 linq language integrated query 整合查詢語言 linq是微軟在.net framework 3.5中信增加的乙個特性。它是用來查詢資料庫和對資料庫查詢的本地集合帶來安全性。它非常...

譯 在大型應用中使用 Redux 的五個技巧

本文講的是 譯 在大型應用中使用 redux 的五個技巧,譯文出自 掘金翻譯計畫 譯者 loveky 校對者 stormrabbit 第二點 把資料物件,對資料物件的修改以及其它 ui 狀態區分開 第三點 在單頁應用的不同頁面間共享資料,以及何時不該這麼做 第四點 在狀態中的不同節點復用通用的 re...