Android 11在app中修改屏幕亮度

devtools/2024/10/19 19:43:40/

先看效果:

Android 11在app中修改屏幕亮度 展示视频

可以看到,这是一个非常简单的功能,拖动进度条,屏幕亮度随即变化,界面上也实时更新亮度值

实现部分:

一、布局文件

1.activity_brightness.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><data><variablename="viewModel"type="com.example.mvvmdemo.ui.brightness.BrightnessViewModel" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ui.brightness.BrightnessActivity"><Buttonandroid:id="@+id/btn_config"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="调节亮度"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_brightness"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.2" /></androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 2.popup_window_brightness.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- PopupWindow布局,包含一个进度条 --><SeekBarandroid:id="@+id/sb_popup_brightness"android:layout_width="match_parent"android:layout_height="wrap_content"android:max="100"android:progress="50" /></LinearLayout>

二、ViewModel层代码

/*** 亮度视图模型类,用于管理应用程序中的亮度设置和权限状态。*/
public class BrightnessViewModel extends ViewModel {// 亮度值的LiveData对象,初始值为50private MutableLiveData<Integer> brightnessValue = new MutableLiveData<>(50);/*** 设置亮度值。* * @param value 要设置的亮度值。*/public void setBrightness(int value) {brightnessValue.setValue(value);}/*** 获取当前的亮度值。* * @return LiveData对象,包含当前的亮度值。*/public LiveData<Integer> getBrightness() {return brightnessValue;}
}

ViewModel层代码主要是定义了一个可观测的参数:亮度值

三 、Activity代码

/*** 该活动类用于控制和显示屏幕亮度。*/
public class BrightnessActivity extends AppCompatActivity {private ActivityBrightnessBinding binding; // 数据绑定实例private BrightnessViewModel viewModel; // 亮度视图模型private PopupWindow popupWindow; // 弹出窗口实例/*** 活动创建时调用。* 初始化界面、设置监听器、获取视图模型并绑定数据。*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this); // 启用边缘到边缘的UIbinding = DataBindingUtil.setContentView(this, R.layout.activity_brightness); // 设置布局// 设置视图的内边距,以适应系统边框ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});viewModel = new ViewModelProvider(this).get(BrightnessViewModel.class); // 获取视图模型实例binding.setViewModel(viewModel); // 绑定视图模型initObserver(); // 初始化观察者binding.btnConfig.setOnClickListener(v -> {showPopup(); // 显示设置弹窗});}/*** 初始化亮度值的观察者。*/private void initObserver(){viewModel.getBrightness().observe(this, brightness -> {binding.tvBrightness.setText(String.valueOf(brightness)); // 更新界面显示的亮度值});}/*** 显示亮度设置的弹出窗口。*/private void showPopup() {// 加载弹窗布局View popupView = LayoutInflater.from(this).inflate(R.layout.popup_window_brightness, null);SeekBar sbPopupBrightness = popupView.findViewById(R.id.sb_popup_brightness);// 创建并显示弹窗popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.BOTTOM, 0, 40);// 设置弹窗中的亮度条进度,并监听进度改变事件sbPopupBrightness.setProgress(viewModel.getBrightness().getValue());sbPopupBrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {viewModel.setBrightness(progress); // 更新视图模型中的亮度值// 动态设置当前窗口的亮度Window window = getWindow();WindowManager.LayoutParams layoutParams = window.getAttributes();layoutParams.screenBrightness = getBrightness(progress); // 转换进度为亮度值window.setAttributes(layoutParams);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// 触摸开始时的操作}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// 触摸结束时的操作}});}/*** 根据进度值获取相应的亮度值。** @param progress 亮度条的进度值* @return 转换后的亮度值(0.01f到1.0f之间)*/private float getBrightness(int progress) {if (progress == 0) {return 0.01f; // 避免除以0}return progress / 100f; // 将进度值转换为0.0f到1.0f之间的亮度值}}

整体的功能实现到此就结束了

四、写在最后

1.测试发现,当亮度值为0.0f的时候,屏幕并不会黑屏。这可能是系统对屏幕亮度最小值有限制,以避免用户无法操作或查看屏幕内容,所以,我这里进行了一些处理

        if (progress == 0) {return 0.01f; // 避免除以0}

2.以上对于屏幕亮度的操作,均是对于app而言的,如果想要调节系统亮度,还需要申请运行时权限:

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


http://www.ppmy.cn/devtools/27416.html

相关文章

MongoDB聚合运算符:$substrBytes

MongoDB聚合运算符&#xff1a;$substrBytes 文章目录 MongoDB聚合运算符&#xff1a;$substrBytes语法使用举例 $substrBytes聚合运算符返回字符串的子串&#xff0c;子串是从指定的索引位置&#xff08;以UTF-8字节为标准&#xff09;开始并包含指定数量的字符&#xff0c;索…

Java:Thread类及常见方法大全(画图+源码详解)

Thread 类是 JVM 用来管理线程的一个类&#xff0c;每一个线程都有一个唯一的 Thread 类与之关联。Java中通常使用 Thread类来进行线程调度&#xff0c;线程管理。 目录 一、Thread 的常见构造方法 二、Thread 的几个常见属性 理解线程是否存活&#xff1a; 理解前台线程与…

nginx 负载均衡

负载均衡是指将来自客户端的请求分发到多个后端服务器上&#xff0c;以达到提高系统性能、增加可用性和实现水平扩展的目的。上篇文章讲反向代理的时候已经知道使用proxy_pass指令将客户端请求转发到一个后端服务器&#xff0c;这里转到多个服务器也就是实现负载均衡需要结合up…

Linux-进程调度器

1. 前言 在计算机中&#xff0c;进程的数量远多于cpu的数量&#xff0c;所以就存在&#xff0c;多个进程抢占一个cpu的情况&#xff0c;所以就需要一套规则&#xff0c;决定这些进程被处理的顺序&#xff0c;这就叫做进程调度。 在我的简单理解下&#xff0c;其实就是把进程放…

备忘录模式(行为型)

目录 一、前言 二、备忘录模式 三、总结 一、前言 备忘录模式(Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;这样可以在之后将该对象恢复到原…

java中的运算

进制 十进制二进制Binary&#xff1a;0b、0B开头&#xff1b;八进制octal&#xff1a; 0开头十六进制&#xff1a; 0x或者0X开头&#xff1b; 二进制表达式 一个字节&#xff0c;最高位是符号位&#xff1a;0标识正数&#xff0c;1表示负数&#xff1b;计算机底层使用补码的…

无缝对接配电自动化:IEC104转OPC UA网关解决方案

随着水电厂自动化发展的要求&#xff0c;具有一定规模的梯级水电站越来越多&#xff0c;为了实现水电站的无人值班(少人值守)&#xff0c;并考虑到节能控制&#xff0c;电厂采用了集中监控。集中监控关注的是整个电网的安全稳定运行及电压、频率和整个电网的电力需求&#xff0…

TCP协议为什么使用三次握手进行连接?

回答: TCP协议使用三次握手来建立一个可靠的连接&#xff0c;确保两端的通信设备都准备好进行数据传输。这个过程涉及三个步骤&#xff1a; SYN&#xff1a;客户端发送一个SYN&#xff08;同步序列编号&#xff09;包到服务器&#xff0c;以开始新的连接。SYN-ACK&#xff1a;…