自動的にデスクトップ用に暗いモードに戻る


デフォルトのプログラミング言語とプラットフォームのUIフレームワークで書かれたデスクトップアプリケーションは、通常、カラースキームの変更にすぐに対応します.デスクトップアプリのためにあなたの作成がそれをしたならば、それはクールでありませんか?あなたの食欲をそそらせてください
Androidでは、暗いモードを使用して検出することができますisSystemInDarkTheme() ( androidx.compose.foundation ), しかし、現在、この機能はデスクトップ用に構成されていません.それで、私たち自身でこれをしましょう.
fun isSystemInDarkTheme(): Boolean {
  return when {
    IS_WINDOWS -> {
      val result = getWindowsRegistryEntry(
          "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize",
          "AppsUseLightTheme")
      result == 0x0
    }
    IS_MACOS -> {
      val result = getDefaultsEntry("AppleInterfaceStyle")
      result == "Dark"
    }
    else -> false
  }
}
ご覧のように、カラーモードは、WindowsレジストリとMacOSのデフォルトデータベースに格納されます.JavaやKOTLINの両方にアクセスするには、ネイティブのパラメータストアと呼ばれる小さなオープンソースライブラリを書いています.それを見つけることができますGitHub . それはあなたのアプリに含めることは簡単です.

マヴェン
<dependency>
  <groupId>com.github.tkuenneth</groupId>
  <artifactId>nativeparameterstoreaccess</artifactId>
  <version>0.1.0</version>
</dependency>

グラグラ
dependencies {
  implementation("com.github.tkuenneth:nativeparameterstoreaccess:0.1.0")
}
今、私たちは場所に図書館を持っていますisSystemInDarkTheme() そして、もっと重要なことは何ですか?あなたのアプリケーションが実行されている間に変更を検出するにはisSystemInDarkTheme() .
fun main() {
  GlobalScope.launch {
    while (isActive) {
      val newMode = isSystemInDarkTheme()
      if (isInDarkMode != newMode) {
        isInDarkMode = newMode
      }
      delay(1000)
    }
  }
  
通常GlobalScope あまりにも広いかもしれませんが、アプリケーションが実行されている限り、検出は、このユースケースのためにそれが非常に適切であることがわかります.アバウトisInDarkMode ?
private var isInDarkMode by observable(false) { _, oldValue, newValue ->
  onIsInDarkModeChanged?.let { it(oldValue, newValue) }
}
private var onIsInDarkModeChanged: ((Boolean, Boolean) -> Unit)? = null
これは、onIsInDarkModeChanged . この限りnull , 何も起こらない.これが実際に設定されている場所です.
@Composable
fun TKDupeFinderContent() {
  var colors by remember { mutableStateOf(colors()) }
  onIsInDarkModeChanged = { _, _ ->
    colors = colors()
  }
  
  DesktopMaterialTheme(colors = colors) {
    Surface {
  
検出自体は、それが同時に行われる必要があるので、構成可能なものの一部であるはずがありません.しかし、変化は再編成を引き起こす必要があります.これはcolors = colors() だってcolors 記憶状態.ここから色が来るところです.
private fun colors(): Colors = if (isInDarkMode) {
  darkColors()
} else {
  lightColors()
}
あなたがこの記事の冒頭のクリップを見たならば、あなたは確かにウインドウ装飾とメニューバーが変わらないことに気がつきました.デスクトップのための構成は、我々は暗いモードを意識したスイングのルックアンドフィールを使用してこれを修正することができるスイングに依存してください.私は、後でこれの上でfolrowigであるかもしれません...