整体调整Android App的UI亮度

要在夜间模式下整体降低 Android 应用的亮度,以实现车内环境中舒适的视觉效果,你可以使用以下几种方法:

友情链接:ACEJoy

  1. 使用主题和样式降低亮度:调整应用的主题和颜色资源,使夜间模式的颜色更暗、更柔和。
  2. 使用屏幕亮度调整:在代码中动态调整屏幕亮度。

下面详细介绍这两种方法:

方法一:调整主题和样式

  1. 创建夜间模式资源文件: 在 res/values-night 文件夹中创建 styles.xml 文件,并定义夜间模式的颜色。
   <resources>
       <!-- Base application theme for Night mode -->
       <style name="AppTheme" parent="Theme.AppCompat.DayNight">
           <!-- Customize your theme here. -->
           <item name="colorPrimary">@color/colorPrimaryNight</item>
           <item name="colorPrimaryDark">@color/colorPrimaryDarkNight</item>
           <item name="colorAccent">@color/colorAccentNight</item>
           <!-- Add more customizations if needed -->
       </style>
   </resources>
  1. 定义夜间模式的颜色: 在 res/values-night/colors.xml 文件中定义较暗的颜色。
   <resources>
       <color name="colorPrimary">#121212</color> <!-- A dark gray color -->
       <color name="colorPrimaryDark">#000000</color> <!-- Black color -->
       <color name="colorAccent">#BB86FC</color> <!-- A soft purple for accents -->
       <!-- Define more colors if needed -->
   </resources>
  1. 启用夜间模式: 在代码中启用夜间模式。例如,在 MainActivity 中:
   import android.os.Bundle;
   import androidx.appcompat.app.AppCompatActivity;
   import androidx.appcompat.app.AppCompatDelegate;

   public class MainActivity extends AppCompatActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           // Enable night mode
           AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
       }
   }

方法二:动态调整屏幕亮度

你可以使用代码动态调整屏幕的亮度,以适应车内环境的需求。

  1. 调整屏幕亮度: 你可以在 Activity 中使用以下代码来调整屏幕亮度:
import android.os.Bundle;
import android.provider.Settings;
import android.view.Window;
import android.view.WindowManager;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Enable night mode
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

        // Set screen brightness to a lower value
        setScreenBrightness(0.1f);  // Value between 0.0 (dark) and 1.0 (bright)
    }

    private void setScreenBrightness(float brightnessValue) {
        Window window = getWindow();
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.screenBrightness = brightnessValue;
        window.setAttributes(layoutParams);
    }
}

请求系统权限(如果需要):

如果你需要全局调整系统亮度,你可能需要请求系统权限。在 AndroidManifest.xml 中添加权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

然后在代码中请求权限:

import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_WRITE_SETTINGS = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Settings.System.canWrite(this)) {
            // Set screen brightness to a lower value
            setScreenBrightness(0.1f);
        } else {
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS);
        }
    }

    

onActivityResult 中处理权限请求的结果:

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
           if (Settings.System.canWrite(this)) {
               // 权限已授予,设置屏幕亮度
               setScreenBrightness(0.1f);
           } else {
               // 权限被拒绝,处理相应的逻辑
               Toast.makeText(this, "需要系统写入权限来调整屏幕亮度", Toast.LENGTH_SHORT).show();
           }
       }
   }

   private void setScreenBrightness(float brightnessValue) {
       // 检查权限是否已授予
       if (Settings.System.canWrite(this)) {
           Window window = getWindow();
           WindowManager.LayoutParams layoutParams = window.getAttributes();
           layoutParams.screenBrightness = brightnessValue;
           window.setAttributes(layoutParams);

           // 设置系统全局的屏幕亮度
           Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, (int) (brightnessValue * 255));
       } else {
           Toast.makeText(this, "没有系统写入权限", Toast.LENGTH_SHORT).show();
       }
   }

结合两种方法

你可以结合上述两种方法,既调整应用的主题颜色,又动态调整屏幕亮度,以达到最佳的夜间模式效果。

总结

  1. 调整应用主题和样式:使用 Android 的 DayNight 主题和夜间模式资源文件,定义较暗的颜色来适应夜间模式。
  2. 动态调整屏幕亮度:在代码中动态调整屏幕亮度,使屏幕整体亮度降低,从而在车内环境中提供更舒适的视觉效果。

通过这两种方法的结合,你可以为用户提供一个更好的夜间使用体验。希望这些方法能够帮助你实现应用的夜间模式功能。


如果不想调整屏幕亮度,你可以通过调整应用的整体 UI 亮度来实现夜间模式效果。以下是几种简单的方法:

方法一:使用半透明的暗色覆盖层

为整个应用添加一个半透明的暗色覆盖层,以降低整体亮度。

  1. 在 XML 布局文件中添加覆盖层: 在你的主布局文件中添加一个 View,并将其设置为半透明的黑色。
   <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <!-- 其他布局组件 -->

       <!-- 覆盖层 -->
       <View
           android:id="@+id/overlay"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#80000000" /> <!-- 50% 透明度的黑色 -->
   </FrameLayout>
  1. 在代码中控制覆盖层的可见性: 在代码中动态控制覆盖层的可见性,以便在需要时启用或禁用夜间模式。
   import android.os.Bundle;
   import android.view.View;
   import androidx.appcompat.app.AppCompatActivity;

   public class MainActivity extends AppCompatActivity {
       private View overlay;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           overlay = findViewById(R.id.overlay);

           // 启用夜间模式
           enableNightMode(true);
       }

       private void enableNightMode(boolean enable) {
           if (enable) {
               overlay.setVisibility(View.VISIBLE);
           } else {
               overlay.setVisibility(View.GONE);
           }
       }
   }

方法二:调整应用的主题颜色

使用 DayNight 主题,并为夜间模式定义较暗的颜色。

  1. 创建夜间模式的颜色资源: 在 res/values-night/colors.xml 文件中定义较暗的颜色。
   <resources>
       <color name="colorPrimary">#121212</color>
       <color name="colorPrimaryDark">#000000</color>
       <color name="colorAccent">#BB86FC</color>
       <!-- 其他颜色定义 -->
   </resources>
  1. styles.xml 中定义夜间模式主题: 在 res/values-night/styles.xml 文件中定义夜间模式的主题。
   <resources>
       <style name="AppTheme" parent="Theme.AppCompat.DayNight">
           <item name="colorPrimary">@color/colorPrimaryNight</item>
           <item name="colorPrimaryDark">@color/colorPrimaryDarkNight</item>
           <item name="colorAccent">@color/colorAccentNight</item>
           <!-- 其他主题属性 -->
       </style>
   </resources>
  1. 启用夜间模式: 在代码中启用夜间模式。
   import android.os.Bundle;
   import androidx.appcompat.app.AppCompatActivity;
   import androidx.appcompat.app.AppCompatDelegate;

   public class MainActivity extends AppCompatActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           // 启用夜间模式
           AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
       }
   }

方法三:动态调整各个 UI 组件的亮度

可以通过编程方式调整各个 UI 组件的亮度,例如背景色和文本色。

  1. 遍历并调整视图树中的每个视图: “`java
    import android.os.Bundle;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // 调整每个视图的亮度 View rootView = findViewById(android.R.id.content); adjustBrightness(rootView, 0.5f); // 0.5 表示 50% 亮度 } private void adjustBrightness(View view, float brightnessFactor) {
    if (view instanceof ViewGroup) {
    ViewGroup viewGroup = (ViewGroup) view;
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
    adjustBrightness(viewGroup.getChildAt(。。。。。。

  1. 递归调整视图树中的每个视图: 下面的代码示例演示了如何递归遍历视图树,并调整每个视图的亮度。该方法适用于 TextViewImageView 等常见视图组件。
   import android.graphics.Color;
   import android.os.Bundle;
   import android.view.View;
   import android.view.ViewGroup;
   import android.widget.TextView;
   import androidx.appcompat.app.AppCompatActivity;

   public class MainActivity extends AppCompatActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           // 调整每个视图的亮度
           View rootView = findViewById(android.R.id.content);
           adjustBrightness(rootView, 0.5f);  // 0.5 表示 50% 亮度
       }

       private void adjustBrightness(View view, float brightnessFactor) {
           // 调整 TextView 的文本颜色
           if (view instanceof TextView) {
               TextView textView = (TextView) view;
               int color = textView.getCurrentTextColor();
               textView.setTextColor(adjustColorBrightness(color, brightnessFactor));
           }

           // 对于其他视图类型,可以在这里添加类似的处理逻辑
           // 例如:调整 ImageView 的图像亮度

           // 如果视图是 ViewGroup,递归调整子视图
           if (view instanceof ViewGroup) {
               ViewGroup viewGroup = (ViewGroup) view;
               for (int i = 0; i < viewGroup.getChildCount(); i++) {
                   adjustBrightness(viewGroup.getChildAt(i), brightnessFactor);
               }
           }
       }

       private int adjustColorBrightness(int color, float brightnessFactor) {
           int alpha = Color.alpha(color);
           int red = (int) (Color.red(color) * brightnessFactor);
           int green = (int) (Color.green(color) * brightnessFactor);
           int blue = (int) (Color.blue(color) * brightnessFactor);
           return Color.argb(alpha, red, green, blue);
       }
   }

方法四:使用自定义的主题属性

你可以创建自定义的主题属性来定义较暗的颜色,并在应用的各个组件中使用这些属性。

  1. 定义自定义主题属性: 在 res/values/attrs.xml 文件中定义自定义属性。
   <resources>
       <attr name="nightModeBackgroundColor" format="color"/>
       <attr name="nightModeTextColor" format="color"/>
   </resources>
  1. 在主题中设置这些属性: 在 res/values/styles.xmlres/values-night/styles.xml 文件中分别设置这些属性。
   <!-- res/values/styles.xml -->
   <resources>
       <style name="AppTheme" parent="Theme.AppCompat.DayNight">
           <item name="nightModeBackgroundColor">@color/lightBackground</item>
           <item name="nightModeTextColor">@color/lightText</item>
       </style>
   </resources>

   <!-- res/values-night/styles.xml -->
   <resources>
       <style name="AppTheme" parent="Theme.AppCompat.DayNight">
           <item name="nightModeBackgroundColor">@color/darkBackground</item>
           <item name="nightModeTextColor">@color/darkText</item>
       </style>
   </resources>
  1. 在布局文件中使用这些属性: 在布局文件中使用这些自定义属性。
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:background="?attr/nightModeBackgroundColor"
       android:textColor="?attr/nightModeTextColor"
       android:text="Hello, World!" />

结论

通过以上几种方法,你可以在不调整屏幕亮度的情况下,实现 Android 应用整体 UI 亮度的降低:

  1. 使用半透明的暗色覆盖层:简单直接,可以快速实现整体亮度降低。
  2. 调整应用的主题颜色:使用 DayNight 主题,实现更加规范的夜间模式。
  3. 动态调整各个 UI 组件的亮度:细粒度控制每个组件的亮度,适用于需要精细调整的场景。
  4. 使用自定义的主题属性:通过自定义属性,灵活定义和应用夜间模式

为实现使用半透明的暗色覆盖层且不影响触摸点击操作,你可以使用 FrameLayout 来添加一个透明的覆盖层,并将它设置为不接收触摸事件。这样可以确保覆盖层不会干扰用户的点击操作。

实现步骤

  1. 在 XML 布局文件中添加覆盖层: 在你的主布局文件中添加一个 View,并将其设置为半透明的黑色。将这个 View 放在布局的最上层,并设置 android:clickable 属性为 false
   <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <!-- 其他布局组件 -->

       <!-- 覆盖层 -->
       <View
           android:id="@+id/overlay"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#80000000" <!-- 50% 透明度的黑色 -->
           android:clickable="false"
           android:focusable="false" />
   </FrameLayout>
  1. 在代码中控制覆盖层的可见性: 在代码中动态控制覆盖层的可见性,以便在需要时启用或禁用夜间模式。
   import android.os.Bundle;
   import android.view.View;
   import androidx.appcompat.app.AppCompatActivity;

   public class MainActivity extends AppCompatActivity {
       private View overlay;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);

           overlay = findViewById(R.id.overlay);

           // 启用夜间模式
           enableNightMode(true);
       }

       private void enableNightMode(boolean enable) {
           if (enable) {
               overlay.setVisibility(View.VISIBLE);
           } else {
               overlay.setVisibility(View.GONE);
           }
       }
   }

确保覆盖层不影响触摸事件

为了确保覆盖层不影响触摸事件,你还可以使用 setOnTouchListener 方法,返回 false,表示覆盖层不处理触摸事件,将它们传递给下面的视图。

import android.os.Bundle;
import android.view.View;
import android.view.MotionEvent;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private View overlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        overlay = findViewById(R.id.overlay);

        // 设置覆盖层的触摸监听器,确保不拦截触摸事件
        overlay.setOnTouchListener((v, event) -> false);

        // 启用夜间模式
        enableNightMode(true);
    }

    private void enableNightMode(boolean enable) {
        if (enable) {
            overlay.setVisibility(View.VISIBLE);
        } else {
            overlay.setVisibility(View.GONE);
        }
    }
}

结论

通过上述方法,你可以使用半透明的暗色覆盖层来降低 Android 应用的整体亮度,同时确保覆盖层不会影响用户的触摸和点击操作。这种方法简单且高效,适用于需要快速实现夜间模式效果的场景。

发表评论