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-xhdpi
、drawable-xxhdpi
就是再建兩個資料夾:drawable-night-xhdpi
、drawable-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...