微信都支援暗黑模式了,咱 App 也適配一波

2021-10-06 04:55:52 字數 3392 閱讀 8919

zhujiang |作者

承香墨影 |校對

|原文第一次聽到暗黑模式的時候,感覺好酷啊,聽著就好看(也不知道我怎麼聽出來的)。

蘋果在前幾年就有暗黑模式的風聲,好像是在 ios11、ios12 的時候就說要推出了,結果愣生生等到了 ios13 暗黑模式才推出。

為了支援 dark 主題,必須將應用的主題設定為,繼承自 daynight 主題(res/values/styles.xml):

還可以使用 materialcomponents 的深色主題:

parent="theme.materialcomponents.daynight">

這會將應用程式的主主題與系統控制的夜間模式標誌相關聯,並為應用程式提供預設的深色主題(啟用時)。當系統的主題切換時,應用也會隨之切換主題。

「這就完了?」

「對啊,主題就設定完了。」

「那我如果想要自定義主題呢?」

大家日常開發中肯定會有這種需求,官方定義的主題不完全能滿足我們的需求,這時候就需要來自定義主題了,谷歌也為我們想到了這一點。

普通模式下咱們不需要動,該怎麼寫怎麼寫,然後在res下再新建乙個values-night的資料夾,然後把你自定義的放進去,name 名為styles.xml中對應的主題名稱就可以了。

來看一下吧:

「不對啊,這只是主題變了,那我的 activity 的背景、字型的顏色、等等該怎麼辦呢?」

「別著急,下面就要說了。」

這裡一定要注意,主題和樣式應避免在淺色主題下使用硬編碼的顏色或圖示,應該使用主題屬性(首選)或夜間限定的資源。來了解下兩個最重要的主題屬性吧:

當然肯定不是必須要使用上面官方提供的兩個主題屬性,想自定義就自定義啊!眼睛尖的可能已經看見了,上面的中的values-night中除了放有style.xml外還有colors.xml,對,沒錯,咱們只要把顏色資訊放入到colors.xml中然後根據需求寫上兩個顏色就好了。

但還是建議使用 material design components,因為它的顏色主題系統 (例如主題屬性 ?attr/colorsu***ce 和 ?attr/coloronsu***ce)可以輕鬆訪問合適的顏色。

theming/color/

「大哥,背景顏色和字型顏色我知道怎麼改了,呢?咋辦啊!」

「來了來了,猴急猴急的!」

設定其實和顏色差不多,也是兩套資源,比如你的drawable資料夾下有一張aaa.jpg的,你想在暗黑模式下換成另外一張,那麼你就可以新建乙個drawable-night的資料夾,在裡面放上你的另外一張就行了,注意, 名稱一定要和drawable中的對應。

同理,drawable-xhdpidrawable-xxhdpi就是再建兩個資料夾:drawable-night-xhdpidrawable-night-xxhdpi,然後放入對應就行了。

「什麼?你想看一下效果?那好吧,如你所願,這真的是你,要是別人我都不讓他看。。。。」

「我還想自己主動切換,不想隨著系統換才換」

「來,你過來,你還想幹啥,說,來來來,說吧」

「我就想自己主動設定是否跟隨系統切換主題。。。我看好多應用都有這個功能」

哎,既然你發自內心的問了,那我就大發慈悲的告訴你:當然可以喲!

一般來說應用都會有幾個選項供你選擇,分別是:普通模式、暗黑模式、跟隨系統,對吧?

谷歌也給了我們這幾個選項,可以直接進行設定:

咱們剛才所說的就是 light、黑暗和系統預設,省電模式這裡就不寫, 如果有需求可以進行實驗。

切換主題的方法也很簡單,直接呼叫下面方法就行:

就一行**就行了,引數需要傳入上面的四種模式之一。

來吧,那就寫一下**吧,按照上面的要求寫三個按鈕,分別來實現普通模式、暗黑模式和系統模式吧:

override fun onclick(v: view)             

r.id.b***ark ->            

r.id.b***efault ->

}}

這個**應該不需要解釋了,上面解釋的已經夠多了。來看一下實現效果吧:

來吧,有需求就得有實現,谷歌大大已經為我們都想好了,應用可以通過宣告每個 activity 可以處理 uimode 配置更改來處理 dark 主題本身的實現:

當 activity 宣告它處理配置更改時,onconfigurationchanged()將在主題更改時呼叫其方法。要檢查當前主題是什麼,應用可以執行如下**:activity#onconfigurationchanged(configuration)

val currentnightmode = configuration.uimode and configuration.ui_mode_night_mask

when (currentnightmode)  // 夜間模式未啟用,我們正在使用淺色主題    

configuration.ui_mode_night_yes -> {} // 夜間模式啟用,我們使用的是深色主題  

}

文章到這裡基本結束了,谷歌用行動告訴我們盡量不要硬編碼,出來混都是要還的,硬編碼一時爽,一直硬編碼一直爽,哈哈哈。

文中原始碼已上傳 github:

推薦閱讀:

okhttp 支援 websocket,從原始碼到協議的分析

git 如何優雅的回退**?

微信支付(微信支付的坑基本上都踩過一遍了)

開始專案 3 建立應用,此處注意填寫應用的包名,和應用簽名,應用簽名可以用簽名工具生成。簽名工具在平台上都可以下得到。統一下單文件大家可以看看。加上請求的引數通過統一下單的介面來獲取會話標識,在return code 和result code都為success的時候獲取prepay id prepa...

不要再混微信群了!

村長經常鼓勵大家要加一些有用的社群 微信群,但很少有人能把這件事情給做好的。因為很多人是抱著 混 的態度 的,所以絕大多數人加入了各種群,最終的結果只有兩種 其一是因為隨意發廣告,違反群規被移除群。其二是長期潛水或者不知道如何互動,在群裡面沒有任何的收穫感。所以,村長今天和各位聊聊,無論是付費還是免...

微信小遊戲websocket支援https wss

2 pcre pcre perl compatible regular expressions 是乙個perl庫,包括perl相容的正規表示式庫。nginx的http模組使用pcre來解析正規表示式,所以需要在linux上安裝pcre庫。yum install y pcre pcre devel 3...