Android 11在app中修改屏幕亮度

先看效果:

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.mzph.cn/bicheng/4955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器终端软件termius以及Xshell + WinSCP组合

1. termius 官网地址&#xff1a;https://termius.com/ Termius是一个跨平台的SSH客户端&#xff0c;它提供了一个便捷的方式来远程连接和管理服务器、虚拟机和网络设备。以下是Termius的一些特点和功能&#xff1a; 跨平台支持&#xff1a;Termius可在多个操作系统上运行&…

基于Guava的异步线程结果监听:ListenableFuture

1.ListenableFuture概述&#xff1a; ListenableFuture是对原有Future的增强&#xff0c;它可以监听异步执行的过程&#xff0c;执行完了&#xff0c;自动触发回调操作。 除此之外&#xff0c;可以分别针对成功或者失败的情况做后续处理。 2.使用场景 你想拿到异步处理的结果…

Mycat(三)读写分离双主双从

文章目录 搭建双主双从双主机配置双从机配置双从配置两个主机互相复制停止从服务复制功能重新配置主从 修改 Mycat 的集群配置实现多种主从双主双从集群角色划分增加两个数据源修改集群配置文件读写分离配置扩展&#xff08;1&#xff09;读写分离(一主一从,无备)(m是主,s是从)…

「C/C++ 01」scanf()与回车滞留问题

目录 〇、scanf()接收用户输入的流程 一、回车的缓冲区滞留问题是什么&#xff1f; 二、为什么&#xff1f; 三、四个解决方法&#xff1a; 1. 在前面的scanf()中加上\n 2. 在scanf("%c")中添加空格 3. 使用getchar()来吸收回车 4. 使用fflush()清空缓冲区 〇、scan…

【火柴题】如何移动一根火柴将2变成5

这里写目录标题 如何移动一根棍子将2变成51、变成第五个字母E2、变成罗马数字5 V3、变成手写体54、商用字体55、古尔穆基数字、藏文数字56、希伯来数字5 如何不动棍子将2变成5使用镜子使用装水的水杯小孔成像透视 如何移动一根棍子将2变成5 1、变成第五个字母E E 2、变成罗马…

【FPGA设计】单端口RAM双端口RAM

When I was young, my dad liked to tell me, “If you don’t ask the question, you won’t get the answer.” Today, I have a deeper understanding of his message – and I have applied his wisdom to many areas in my life. Harry Foster 概述 大家知道,RAM IP核分…

什么是scrum中的3355?

&#xff08;学校作业&#xff09; Scrum中的3355是指Scrum框架中的三个核心角色、三个工件、五个关键事件和五个价值观。 三个核心角色包括&#xff1a; 产品负责人&#xff08;Product Owner&#xff09;&#xff1a;主要负责确定产品的功能和达到要求的标准&#xff0c;指…

力扣HOT100 - 207. 课程表

解题思路&#xff1a; class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {int[] inDegree new int[numCourses];//存每个结点的入度List<List<Integer>> res new ArrayList<>();//存结点之间依赖关系Queue<Integer>…

获客难题怎么破?揭秘那些企业高效拓客的背后秘密

在当今的商业环境中&#xff0c;客户资源的获取是企业生存和发展的关键。然而&#xff0c;传统的获客方式往往既耗时又费力&#xff0c;且效率不高。随着科技的进步和大数据的普及&#xff0c;一种新兴的获客工具——自动获客软件应运而生&#xff0c;它以其精准高效的特点&…

百度文库公测智能漫画和智能话本,有兴趣的可以申请一下

百度文库上线智能文库和智能话本功能&#xff0c;目前处于公测中&#xff0c;我刚申请&#xff0c;还在审核中。 智能漫画&#xff0c;参照官网的示例截图&#xff0c;生成的图片看起来不错&#xff0c;没试用过所以不太清楚他的操作模式是什么 智能话本&#xff0c;生成的话…

【高校科研前沿】华东师大白开旭教授博士研究生李珂为一作在RSE发表团队最新成果:基于波谱特征优化的全球大气甲烷智能反演技术

文章简介 论文名称&#xff1a;Developing unbiased estimation of atmospheric methane via machine learning and multiobjective programming based on TROPOMI and GOSAT data&#xff08;基于TROPOMI和GOSAT数据&#xff0c;通过机器学习和多目标规划实现大气甲烷的无偏估…

使用python写一个识别车牌原理

车牌识别&#xff08;License Plate Recognition, LPR&#xff09;通常涉及几个关键步骤&#xff1a;图像预处理、车牌定位、字符分割和字符识别。以下是一个简化的原理说明和Python代码示例&#xff0c;帮助你理解如何使用Python进行车牌识别。 1. 图像预处理 灰度化&#xf…

python学习笔记----函数(五)

一、函数介绍 在 Python 中&#xff0c;函数是一个组织好的、可重用的代码块&#xff0c;用来执行一个单一的、相关的动作。函数提供了代码的模块化和代码复用的能力。它可以接受输入参数&#xff0c;并可以返回一个结果。函数在 Python 编程中是基本的构建块之一。 二、函数…

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 &#xff08;一&#xff09;Docker网络实现原理 &#xff08;二&#xff09;Docker网络模式 1. Bridge网络&#xff08;默认&#xff09; 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 &#xff08;一&#xff09;cgr…

LangChain Routing 学习笔记

LangChain Routing 学习笔记 0. 引言1. 使用提示词2. 使用 RunnableLambda 0. 引言 在使用大语言模型开发应用时&#xff0c;其中一个场景就是根据不同的输入&#xff0c;调用&#xff08;或者说路由到&#xff09;不同的逻辑。这就好比我们以前开发时经常使用的if ... else .…

搜索引擎的定义与运行原理

搜索引擎是一种用于在互联网或特定数据源中搜索信息的工具&#xff0c;它通过自动化程序&#xff08;称为爬虫或蜘蛛&#xff09;从网页或数据库中收集信息&#xff0c;并根据用户输入的关键词或短语返回相关的搜索结果。其运行原理可以简单概括如下&#xff1a; 爬取网页&…

cf914div2C

考虑相邻的两堆石子如果是2 3,那么先手可以选2,然后3变成1,这时后手只能选1,考虑2 4的情况,先手选1,剩下1 3,后手只能选1,剩下一个2,先手选1,剩1,后手只能选1.所以只要第一个数不为1的情况下,先手必胜,那么问题变成了找到mex(第一个未出现的数字),如果这个数字为偶数,先手是Bob…

电池管理协议SMBus/I2C在STM32CubeMX配置使用-读取SN8765电池组

一、前言 目前有个电源组需要通过i2c进行读取&#xff0c;获取一些电池信息&#xff0c;采用SMBus协议进行读取&#xff0c;其可以看作i2c的子集&#xff0c;可以直接通过i2c的接口进行读写。SMBus建立在被广泛采用的I2C总线之上&#xff0c;并定义了OSI&#xff08;开放系统互…

进行RLC防孤岛负载测试的步骤和规范

RLC防孤岛负载测试是用于检测并防止电力系统出现孤岛现象的测试方法&#xff0c;孤岛现象是指当电网因故障或停电而与主电网断开连接时&#xff0c;部分电力设备仍在运行&#xff0c;形成一个没有与主电网连接的独立电网。这种情况下&#xff0c;如果电力设备不能及时检测到孤岛…

dmdbchk检查数据库完整性正确性(达梦数据库)

dmdbchk检查数据库完整性正确性- - 达梦数据库 1 简介2 使用 dmdbchk3 dmdbchk 报告解读4 达梦数据库学习使用列表 1 简介 dmdbchk 是 DM 提供的用于检查数据库完整性、正确性的命令行工具。在服务器正常关闭后的脱机情况下&#xff0c;用户可以使用 dmdbchk 对数据库进行校验…