深色模式,也稱為夜間模式或黑暗模式,具有比常規模式更低的亮度和更高的對比度。在晚上或灰暗的環境中使用深色模式可以減少眼睛疲勞,有利於保護眼睛健康。此外,深色模式還可以節省電量和延長電池壽命。因此,實現Android應用的深色模式已經是一個很有必要的功能。
一、Android的深色模式
Android 10 (API Level 29)中引入了深色主題(Dark Theme)API,讓 Android 應用程序能夠在日間模式和夜間模式之間進行切換,同時還支持不根據時間自動切換模式等功能。在深色模式下,Android 會應用適當的顏色主題來替換 APP 中淺色的背景和前景色。對於 Android 應用程序,只需在 res/values 下建立一個對應的 dark 文件夾,在裡面建立相同的 XML 文件,然後更改 AndroidManifest.xml 中的 android:theme.
二、應用的深色模式實現
深色模式可以通過兩種方式實現:手動設置和跟隨系統。不同的應用程序有不同的實現方式,但大致思路都相同,通過檢測系統主題的更改來觸發相應的樣式處理。下面提供一個簡單的示例,演示如何使用 AppCompat 庫實現應用的深色模式。
1. 設置主題
在 styles.xml 文件中定義一個名為 AppTheme 的主題,並繼承自 AppCompat 的日間主題。然後在 styles.xml (night) 文件中定義名為 AppDarkTheme 的主題,並繼承自 AppCompat 的深色主題。這樣,我們就有了日間和深色兩個主題。例如:
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@color/background_light</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/textColorPrimaryLight</item>
<item name="android:textColorSecondary">@color/textColorSecondaryLight</item>
</style>
<style name="AppDarkTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@color/background_dark</item>
<item name="colorPrimary">@color/colorPrimaryDark</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/textColorPrimaryDark</item>
<item name="android:textColorSecondary">@color/textColorSecondaryDark</item>
</style>
</resources>
2. 實現深色模式的開關按鈕
在應用的設置界面添加一個深色模式的開關按鈕。可以使用 Switch 按鈕,示例如下:
<Switch
android:id="@+id/switchDarkMode"
android:text="@string/switch_dark_mode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorBlack"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
3. 觸發深色模式
使用以下代碼控制應用程序的深色模式:
switchDarkMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//檢測當前系統主題
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// 切換到深色模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
break;
case Configuration.UI_MODE_NIGHT_YES:
// 切換到日間模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
break;
}
// 重啟該Activity以生效
recreate();
}
});
三、結語
深色模式可以給用戶帶來更好的使用體驗和更低的眼睛疲勞。開發人員應該考慮支持深色模式,並實現相應的切換機制。隨著 Android Q 中的深色主題 API 的出現,實現 Android 應用的深色模式變得更為容易。希望這篇文章可以為你實現深色模式提供一些幫助。
完整的代碼示例:
styles.xml:
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@color/background_light</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/textColorPrimaryLight</item>
<item name="android:textColorSecondary">@color/textColorSecondaryLight</item>
</style>
</resources>
styles.xml (night):
<resources>
<style name="AppDarkTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@color/background_dark</item>
<item name="colorPrimary">@color/colorPrimaryDark</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/textColorPrimaryDark</item>
<item name="android:textColorSecondary">@color/textColorSecondaryDark</item>
</style>
</resources>
主界面布局 activity_main.xml:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:text="@string/app_name"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
<TextView
android:text="@string/hello_world"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
<Switch
android:id="@+id/switchDarkMode"
android:text="@string/switch_dark_mode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorBlack"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</LinearLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private Switch switchDarkMode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
switchDarkMode = findViewById(R.id.switchDarkMode);
switchDarkMode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//檢測當前系統主題
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
// 切換到深色模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
break;
case Configuration.UI_MODE_NIGHT_YES:
// 切換到日間模式
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
break;
}
// 重啟該Activity以生效
recreate();
}
});
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/308759.html