Android 15强制edge-to-edge全面屏体验
一、背景
Edge-to-edge 全面屏体验并非 Android 15 才有的新功能,早在 Android 15 之前系统就已支持。然而,该功能推出多年来,众多应用程序依旧未针对全面屏体验进行适配。因此,在 Android 15 的更新中,Google 终于决定强推这一功能,力求让所有应用程序都能带来更出色的使用体验。
需要注意的是,在 Android 15 系统下,仅当应用程序将 targetSdkVersion 指定为 35 或更高版本时,系统才会强制启用 edge-to-edge 功能。所以,若开发者不想进行适配,只要不升级 targetSdkVersion 版本即可。
二、什么是 edge-to-edge 全面屏体验
我们的 App 将以边到边的方式显示,窗口会在系统栏后面绘制,从而跨越整个显示屏的宽度和高度。系统栏包括状态栏、标题栏和导航栏。
下面通过一个具体示例,来深入探究 edge-to-edge 全面屏效果。在项目里,当把 targetSdkVersion 指定为 34 时,默认不会强制开启 edge-to-edge 功能。以下是相关代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:contentDescription="@null"android:scaleType="fitXY"android:src="@drawable/test" /></LinearLayout>
</androidx.core.widget.NestedScrollView>
将该项目运行于 Android 15 设备上,效果如下图所示:
当把 targetSdkVersion 指定为 35 或者更高版本时,App 会自动切换至 edge-to-edge 全面屏效果,如下图所示:
为确保在开启 edge-to-edge 全面屏体验后,导航条不会因背景因素而难以辨认,Android 系统做了相应优化。当在屏幕上进行滚动操作时,导航条的颜色会随之改变。
若手机底部采用的是传统的 Back、Home、Task 三按键导航栏,而非手势导航栏,edge-to-edge 全面屏体验会有所不同。此时,导航栏会呈现半透明效果,默认不透明度为 80%,效果如下:
从这种显示效果能够看出,三按键导航栏在 edge-to-edge 全面屏体验方面存在明显不足,未来很可能会逐渐被 Android 系统边缘化。
随着 edge-to-edge 全面屏体验的普及,一些与状态栏、导航栏颜色设置相关的 API 也逐渐被边缘化。这是因为这些 API 与 edge-to-edge 全面屏体验存在冲突,部分 API 当下已无法使用,部分则不再被推荐使用,例如以下这些 API:
Window#setStatusBarColor
Window#setStatusBarContrastEnforced
Window#setNavigationBarColor
Window#setNavigationBarContrastEnforced
三、如何适配
是否需要针对 edge-to-edge 全面屏进行额外的适配工作,很大程度上取决于应用界面的具体设计。就像前文第二节所举的例子,即便不做任何适配,用户体验依旧良好。然而,换作其他界面,情况可能就大不相同了。
接下来,我们以腾讯 QMUI_Android 的主界面为例,看看它在 edge-to-edge 全面屏体验下的实际效果,结果如下:
可以看到,这次的显示效果并不理想。在主界面,底部的 tab 栏陷入了导航栏区域,这会对 tab 按钮的操作产生干扰。而在其他页面,页面内容延伸到了状态栏区域,使得页面内容与状态栏相互重叠,严重影响了内容的可读性。
这这些问题正是 edge-to-edge 全面屏体验可能带来的典型状况,同时也是我们在开发过程中需要进行适配优化的重点方向。
2.1 启用无边框显示
前面说过,edge-to-edge 全面屏体验其实并不是全新的功能,在 Android 15 之前也是支持的,Android 15 只是将这个功能强制开启了而已。要在 Android 15 之前的设备上启用 edge-to-edge 全面屏体验,只需要额外两步就可以完成。
第一步,在项目的build.gradle文件中添加如下库的依赖:
dependencies {// Java language implementationimplementation 'androidx.activity:activity:$activity_version'// Kotlinimplementation 'androidx.activity:activity-ktx:$activity_version'
}
第二步,在Activity的onCreate函数中添加如下代码:
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {enableEdgeToEdge()super.onCreate(savedInstanceState)...}
}
enableEdgeToEdge 应在 setContentView 之前调用此方法,默认情况下,enableEdgeToEdge 会使系统栏透明,但在三按钮导航模式下,状态栏会获得半透明的遮罩。系统图标和遮罩的颜色会根据系统的浅色或深色主题进行调整。
2.2 系统条
适配的代码其实还是比较简单的,主要就是借助 ViewCompat.setOnApplyWindowInsetsListener 这个函数,来对某些指定的 View 进行偏移,保证其不会被系统的状态栏或导航栏遮挡住就可以了。
在第二节的例子中,若要避免图片被状态栏和导航栏遮挡,只需对代码进行如下修改:
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}}
}
由于我们不希望图片延伸到状态栏和导航栏区域,所以调用 WindowInsetsCompat.Type.systemBars 来获取所有系统条(包含状态栏和导航栏)的 Insets。借助这个 Insets,我们能够获取状态栏和导航栏的高度,然后为 NestedScrollView 设置内边距(padding),这样就能确保图片内容不会进入状态栏和导航栏。
添加这段代码后,重新运行程序,便可得到较为理想的显示效果,具体效果如下:
除了 WindowInsetsCompat.Type.systemBars,还有多种其他类型的 Insets 可供选择:
-
若希望某个 View 不进入状态栏区域,可使用 WindowInsetsCompat.Type.statusBars。
-
若希望某个 View 不进入导航栏区域,可使用 WindowInsetsCompat.Type.navigationBars。
-
若希望某个 View 不进入 Cutout 区域,可使用 WindowInsetsCompat.Type.displayCutout。
Cutout 这一概念是在 Android 9 系统中引入的。当时,手机市场刚兴起刘海屏,为了适配可能出现的各种不同样式的刘海设计,Google 推出了 Cutout API。不过,后来手机厂商并未设计出各种奇形怪状的刘海,大多选择将刘海区域整合到状态栏中。因此,如今 displayCutout 这个 API 的实际效果与 statusBars 已无太大差异。
2.3 应用圆角
在 Android 设备的屏幕设计中,圆角屏幕逐渐成为一种流行趋势。从 Android 12(API 级别 31)开始,系统提供了 RoundedCorner 和 WindowInsets.getRoundedCorner 相关 API,利用这些 API 可以获取设备屏幕圆角的半径和中心点。其主要目的在于避免应用的界面元素在圆角屏幕上被截断,从而保证应用在不同屏幕形状的设备上都能有良好的显示效果。
当在应用中实现这些 API 时,无需担心对非圆角屏幕设备产生影响,因为这些 API 仅会在支持圆角屏幕的设备上生效,对于非圆角屏幕设备不会有任何额外的处理。
以下示例代码展示了如何依据 RoundedCorner 提供的信息来设置视图的外边距,从而避免界面元素被截断。这里以获取屏幕左上角的圆角信息为例:
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_main)val main = findViewById<View>(R.id.main)ViewCompat.setOnApplyWindowInsetsListener(main) { _, insets ->if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {val rootWindowInsets = main.rootWindowInsets// 获取屏幕左上角的圆角信息 val topLeft = rootWindowInsets?.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT)Log.d("lx-test", " topLeft: $topLeft")// 根据topLeft的信息设置外边距}insets}}
}
运行日志如下:
在获取到屏幕圆角信息后,后续我们可进一步根据 RoundedCorner 对界面进行外边距的设置,以此有效避免界面元素被屏幕圆角截断,提升应用在圆角屏幕设备上的视觉体验。
2.4 手势导航
自 Android 10 起,Google 引入了手势导航功能。在此模式下,手机屏幕的左右两侧可用于触发 Back 键操作,屏幕底部则用于触发 Home 键操作,其触发区域如下面的图示中的橙色部分所示:
这意味着,若我们设计的应用界面在这些区域也存在相似的手势操作,就会引发手势冲突问题,导致用户操作无法正常执行。
如同处理系统栏内边距问题一样,我们可以借助 WindowInsetsCompat.Type.systemGestures 来获取橙色区域的 Insets。随后,通过设置内边距(padding)的方式,让存在事件冲突的 View 避开这个区域,从而避免与系统手势内边距重叠,确保用户操作的流畅性。
2.5 Material 组件
许多基于 View 的 Android Material 组件 (com.google.android.material)具备自动处理边衬区的能力,像 BottomAppBar、BottomNavigationView、NavigationRailView 以及 NavigationView这些组件都能自行处理边衬区的相关问题。
然而,AppBarLayout 它不会自动处理内边距。可以添加 android:fitsSystemWindows="true" 以处理顶部边衬区。
所以,当项目中使用了 Material 组件时,开发者需要依据具体的应用场景,有针对性地对这些组件进行适配操作,以确保界面在不同的系统环境下都能有良好的显示和交互效果。
2.6 沉浸模式
在某些场景下,将内容以全屏模式呈现,能为用户带来绝佳体验,使其更具身临其境之感。为了在沉浸模式下隐藏系统栏,可以借助 WindowInsetsController 和 WindowInsetsControllerCompat 库来实现。示例代码如下:
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
// 隐藏系统栏
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
// 显示系统栏
windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
当采用无边框设计时,可能需要手动调整系统栏图标颜色,确保其与应用背景形成鲜明对比,以提升视觉辨识度。例如,若要创建浅色状态栏图标,可按以下步骤操作:
WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = false
四、Compose中如何适配
下面是将第二节的代码转换为 Jetpack Compose 实现的内容。转换后的代码如下:
class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContent {EdgeToEdgeTheme {MainPage()}}}
}@Composable
fun MainPage() {Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {Image(painter = painterResource(id = R.drawable.test),contentDescription = null,contentScale = ContentScale.FillWidth,modifier = Modifier.fillMaxWidth())}
}
若不希望图片延伸到状态栏和导航栏区域,可借助 Modifier 的 systemBarsPadding 函数,对指定的可组合项进行偏移,从而避免其被系统的状态栏或导航栏遮挡。修改后的代码如下:
@Composable
fun MainPage() {Column(modifier = Modifier.fillMaxSize().systemBarsPadding() .verticalScroll(rememberScrollState())) {// ...}
}
systemBarsPadding 是 Compose 内置的专门用于处理 Insets 问题的函数。此外,Compose 还提供了许多其他实用的函数:
-
statusBarsPadding:可防止 Compose 控件的内容绘制到状态栏区域。
-
navigationBarsPadding:能避免 Compose 控件的内容绘制到导航栏区域。
-
displayCutoutPadding:可保护 Compose 控件的内容不进入 Cutout 区域。
-
safeDrawingPadding:该函数可确保 Compose 控件的内容不会绘制到任何系统 UI 区域,涵盖状态栏、导航栏、刘海区域等,是最常用的 Insets 处理函数之一。
-
safeGesturesPadding:能避免与系统手势发生冲突。
-
safeContentPadding:它是 safeDrawingPadding 和 safeGesturesPadding 的结合,可保证界面和手势都不会与系统 UI 发生冲突或覆盖。
除了上述这些常用函数外,Compose 还提供了众多用于解决其他场景问题的 Insets 函数,例如曲面屏手机、输入法弹出等场景。由于函数数量较多,这里不再逐一介绍。若你想深入了解,可以参考官方文档
https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier
另外,如果你使用了一些 Compose Material 3 的控件,像 TopAppBar、BottomAppBar、NavigationBar 等,它们会自动处理 Insets 问题,无需手动进行适配。
相关文章:
Android 15强制edge-to-edge全面屏体验
一、背景 Edge-to-edge 全面屏体验并非 Android 15 才有的新功能,早在 Android 15 之前系统就已支持。然而,该功能推出多年来,众多应用程序依旧未针对全面屏体验进行适配。因此,在 Android 15 的更新中,Google 终于决…...
广州可信数据空间上线:1个城市枢纽+N个产业专区+高质量数据集(附28个数据集清单)
广州数据要素市场今日迎来历史性突破!全国首个城市可信数据空间正式上线,首批28个高质量数据集同步出台,覆盖生物医药、智能装备、绿色低碳等12大产业领域,激活37个高价值场景。 一、广州城市可信数据空间:1个城市枢纽…...
AgentGPT开源程序可以在浏览器中组装、配置和部署自主人工智能代理
一、软件介绍 文末提供程序和源码下载学习 AgentGPT开源程序可以允许您配置和部署自主 AI 代理。命名您自己的定制 AI 并让它开始实现任何可想象的目标。它将通过思考要执行的任务、执行它们并从结果中学习来尝试达到目标。 二、开始使用 AgentGPT 入门最简单的方式是使用项目…...
前端笔记-Axios
Axios学习目标 Axios与API交互1、Axios配置与使用2、请求/响应拦截器3、API设计模式(了解RESTful风格即可) 学习参考:起步 | Axios中文文档 | Axios中文网 什么是Axios Axios 是一个基于 Promise 的现代化 HTTP 客户端库,专…...
【EasyPan】MySQL主键与索引核心作用解析
【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版 MySQL主键与索引核心作用解析 一、主键(PRIMARY KEY)核心作用 1. 数据唯一标识 -- 创建表时定义主键 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,use…...
基于RK3588+FPGA+AI YOLO的无人船目标检测系统(一)概述
无人船在海洋监测、资源勘测、海上安全和科学研究等领域扮演着关键角色, 提升了海上任务的执行效率和安全性。在这一过程中,环境感知技术和目标检测 技术相辅相成,共同构建了系统的核心功能。随着人工智能行业的迅速发展,各 种…...
无人船 | 图解基于PID控制的路径跟踪算法(以全驱动无人艇WAMV为例)
目录 1 PID控制基本原理2 基于全驱动运动学的PID控制3 跟踪效果分析 1 PID控制基本原理 PID控制是一种常用的经典控制算法,其应用背景广泛,例如 工业自动化控制:温度控制、压力控制、流量控制、液位控制等过程控制系统多采用PID闭环&#x…...
为什么RPN经过的候选框处理后,要使用rcnn来进行候选框的分类和回归操作?
一句大白话总结:RPN是广撒网捕鱼,RCNN是细化鱼的分类和具体尺寸 在目标检测任务中,RPN(区域提议网络) 生成的候选框需要经过 RCNN(如 Fast R-CNN、Faster R-CNN) 进行分类和回归,这…...
代码实战保险花销预测
文章目录 摘要项目地址实战代码(初级版)实战代码(进阶版) 摘要 本文介绍了一个完整的机器学习流程项目,重点涵盖了多元线性回归的建模与评估方法。项目详细讲解了特征工程中的多项实用技巧,包括࿱…...
8.1 线性变换的思想
一、线性变换的概念 当一个矩阵 A A A 乘一个向量 v \boldsymbol v v 时,它将 v \boldsymbol v v “变换” 成另一个向量 A v A\boldsymbol v Av. 输入 v \boldsymbol v v,输出 T ( v ) A v T(\boldsymbol v)A\boldsymbol v T(v)Av. 变换 T T T…...
PythonWeb
参考:如何安装 Django |Django 文档 |姜戈 一、框架搭建 1、安装Django框架 pip3 install django 2、查看是否安装成功 pip3 show django 这样显示就是成功了 3、初始化项目 你想在哪个路径就 cd到哪个路径下输入一下命令就可以 django-admin startproject my…...
【大模型ChatGPT +DeepSeeK+python】最新AI赋能Python长时序植被遥感动态分析、物候提取、时空变异归因及RSEI生态评估
在遥感技术与人工智能深度融合的2025年,AI大模型正重塑长时序植被遥感数据分析范式。从Landsat/Sentinel卫星数据的智能化去云处理,到MODIS植被产品的AI辅助质量控制,以ChatGPT 、DeepSeeK为代表的大模型技术已成为提升遥感数据处理效率与精度…...
精益数据分析(11/126):辨别虚荣指标,挖掘数据真价值
精益数据分析(11/126):辨别虚荣指标,挖掘数据真价值 大家好!在创业和数据分析的学习道路上,我一直希望能和大家携手前行、共同进步。今天,咱们接着深入研读《精益数据分析》,这次聚…...
Time to event :Kaplan-Meier曲线、Log Rank检验与Shiny R
代码: # 创建数据框 data_a <- data.frame( usubjid = c(1- 1, 1- 2, 1- 3, 1- 4, 1- 5, 1- 6, 1- 7, 1- 8, 1- 9, 1-10, 2- 1, 2- 2, 2- 3, 2- 4, 2- 5, 2- 6, 2- 7, 2- 8, 2- 9, 2-10), cnsr = c(0,1,0,1,0,1,0,0,0,1,…...
线上救急-AWS限频
线上救急-AWS限频 问题 在一个天气炎热的下午,我正喝着可口可乐,悠闲地看着Cursor生成代码,忽然各大群聊中出现了加急➕全体的消息,当时就心里一咯噔,点开一看,果然,线上服务出问题࿰…...
JavaWeb学习打卡-Day1-分层解耦、Spring IOC、DI
三层架构 Controller(控制层):接收前端发送的请求,对请求进行处理,并响应数据。Service(业务逻辑层):处理具体的业务逻辑。DAO(数据访问层/持久层)ÿ…...
【LeetCode】1.两数之和
目录 📚 题目概要🧰 前置知识🚧 问题难点🔑 关键思路步骤拆解 💻 代码实现代码注释 📊 复杂度分析❗ 易错点与测试案例易错点测试案例 🔗 总结与扩展模式归纳核心思维 📚 题目概要 在…...
mongodb 存储数据的具体实现方式
MongoDB 存储数据的具体实现方式涉及数据模型、存储引擎、分片机制等多个核心模块,以下是其实现原理的详细分析: 一、数据模型 1.1 文档型数据模型 MongoDB 使用 BSON格式存储数据,支持键值对、嵌套文档和数组等复杂结构。 1.2 无模式设…...
【手机】vivo手机应用声音分离方案
文章目录 前言方案 前言 尝试分离vivo手机音乐与其他应用的声音 方案 最佳方案:网易云音乐设置内关闭音量均衡 上传不同的白噪音,成功 goodlock,主要适用于三星手机,vivo不一定适用 app volume control ,可行...
多级缓存架构,让系统更快的跑起来!
大家好,今天,咱们来聊聊一个超级实用的话题——多级缓存架构。别一听“架构”俩字就头大,我保证,这篇文章既有趣又易懂,让你秒变缓存小达人! 一、多级缓存,为啥这么火? 在互联网的汪洋大海里,数据就是咱们的宝藏。但每次从数据库里捞数据,都跟挖宝藏似的,慢得很!…...
Vibracostic EDI 需求分析
Vibracostic 是德国Freudenberg集团旗下全球领先的减振与噪音控制技术公司,专注于为汽车及工业领域提供高效振动管理和隔音解决方案,客户涵盖宝马、奔驰、特斯拉等主流车企。 Vibracostic EDI 需求分析 供应商接收Vibracostic发来的DELFOR交付预测报文…...
基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention
基于超启发鲸鱼优化算法的混合神经网络多输入单输出回归预测模型 HHWOA-CNN-LSTM-Attention 随着人工智能技术的飞速发展,回归预测任务在很多领域得到了广泛的应用。尤其在金融、气象、医疗等领域,精确的回归预测模型能够为决策者提供宝贵的参考信息。为…...
Linux卸载删除gitlab
1、停止 gitlab服务 gitlab-ctl stop 2、卸载 gitlab(社区版) rpm -e gitlab-ce 或者 yum remove gitlab-ce 3、查看 gitlab 进程 ps aux | grep gitlab 4、杀掉gitlab service进程,该进程与runsvdir相关(带有好多..........…...
高品质性价比之王-特伦斯便携钢琴V10
在电子钢琴选购过程中,预算与品质的平衡常常让消费者感到纠结。但特伦斯 V10 88 键可折叠电子钢琴的出现,为广大音乐爱好者带来了惊喜,亲民的价格实现了高品质的音乐体验。 先看便携性,同价位的电子钢琴大多体型庞大,…...
解决方案评测|告别复杂配置!基于阿里云云原生应用开发平台CAP快速部署Bolt.diy
写在前面的话 突然看到上线了关于Bolt.new开源版本的解决方案测评,其实心里还是挺高兴的,我最早接触到Bolt.new的时候应该是在去年的11月份,当时是撰写了一篇名为一种基于通义千问prompt辅助Qwen2.5-coder-32bBolt.newv0Cursor的无代码对话…...
python测试框架之pytest
Pytest pytest 基础使用pytest安装pytest的测试case收集规则pytest - fixture的使用skip and xfailpytest - 属性标记测试函数pytest - 参数化测试pytest - mock/monkeypatch的使用pytest - 运行方式pytest - 运行方式/命令pytest - 处理测试失败的case pytest - 测试输出捕获 …...
uni-app 开发企业级小程序课程
课程大小:7.7G 课程下载:https://download.csdn.net/download/m0_66047725/90616393 更多资源下载:关注我 备注:缺少两个视频5-14 tabs组件进行基本的数据展示和搜索历史 处理searchData的删除操作 1-1导学.mp4 2-10小程序内…...
深度图可视化
import cv2# 1.读取一张深度图 depth_img cv2.imread("Dataset_depth/images/train/1112_0-rgb.png", cv2.IMREAD_UNCHANGED) print(depth_img.shape) cv2.imshow("depth", depth_img) # (960, 1280) print(depth_img)# 读取一张rgb的图片做对比 input_p…...
Java实现希尔排序算法
1. 希尔排序原理图解 希尔排序是插入排序的一种高效改进版本,通过比较和交换间隔较远的元素来减少数据的移动次数。以下是希尔排序的步骤: 1. 选择初始间隔:通常选择数组长度的一半作为初始间隔。 2. 分组和插入排序:将数组分成若…...
Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目
持续深耕 RocketMQ 领域,更多实战避坑指南、源码解析、最佳实践,已整理至「RocketMQ 中文社区」 🔍 近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技…...
2025年智慧交通与能源技术国际会议(ITNET 2025)
The 2nd International Conference on Intelligent Transportation and Energy Technology 一、大会信息 会议简称:ITNET 2025 大会时间:(以官网为准) 大会地点:中国南京 收录检索:提交Ei Compendex,CPCI,CNKI,Google…...
Spring Boot 集成 Redis 实战总结
Spring Boot 集成 Redis 实战总结 一、基础集成与配置 依赖引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>默认使用 Lettuce 作为连接池…...
ubuntu18.04启动不了修复
参考: 虚拟机里的Ubuntu18.4启动时进入到grub rescue救援模式(无法正常进入到系统),ls查看后只有一个硬盘和分区,且无法找到/boot/grub文件【已解决】_ubuntu grub rescue-CSDN博客 本人fdisk错误使用,导致了grub启动不了 第一步…...
人类行为的原动力是自我保存-来自ChatGPT
自我保存(Self-Preservation)确实可以说是人类行为最原始、最底层的驱动力。 简单来说: 无论我们做什么,表面看动机五花八门,实际上归根到底都绕不开活下去、保护自己。 💡 从不同层面理解这个观点&#…...
退役淘汰的硬盘数据安全处置不可忽视-硬盘数据抹除清零
在信息化时代,硬盘作为数据存储的核心载体,其退役处理直接关系到信息安全,淘汰硬盘中往往留存大量敏感信息,若处置不当,极易引发数据泄露风险,造成难以挽回的损失。因此,建立规范的硬盘数据销毁…...
创建 Node.js Playwright 项目:从零开始搭建自动化测试环境
一、环境准备 在开始创建 Playwright 项目之前,确保你的电脑上已经安装了以下工具: Node.js:Playwright 依赖于 Node.js 环境,确保你已经安装了最新版本的 Node.js。可以通过以下命令检查是否安装成功: node -v npm -…...
1+X: Python程序开发职业技能等级要求(初级)练习资料分享
以下将根据表1中Python程序开发职业技能等级要求(初级)的不同工作领域和任务,分别给出练习代码或操作步骤。 Python基础编程 开发环境搭建 操作步骤:以Windows系统为例,首先从Python官方网站(https://www…...
【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE)
【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE) 1. 漏洞描述 Apache OFBiz 是一个开源的企业资源规划(ERP)系统。它提供了一套企业应用程序,用于集成和自动化企业的许多业务流程。 这个漏洞是由于对 CVE-2023-51467 的…...
【React】获取元素距离页面顶部的距离
文章目录 代码实现 代码实现 import { useEffect, useRef, useState } from react;const DynamicPositionTracker () > {const [distance, setDistance] useState(0);const divRef useRef(null);useEffect(() > {const targetDiv divRef.current;if (!targetDiv) re…...
【Markdown】【HTML】在Markdown中实现康奈尔笔记模式(右侧留白)
文章目录 HTML表格——康奈尔笔记法标签解释<table> 相关标签文本内容标签注释标签 最低限度应了解的HTML标签 (Essential HTML Tags)结构标签 (Structure Tags)文本标签 (Text Tags)列表标签 (List Tags)链接和图片 (Links and Images)格式化 (Formatting)表格 (Tables)…...
Go语言中的Context
目录 Go语言中的Context 1. Context的基本概念 1.1 Context的核心作用 2. Context的基本用法 2.1 创建Context 背景Context 可取消的Context 带有超时的Context 2.2 在Goroutine间传递Context 2.3 获取Context的值 为Context添加自定义数据 访问Context中的值 3. C…...
基于Python的图片/签名转CAD小工具开发方案
基于Python的图片/签名转CAD工具开发方案 一、项目背景 传统设计流程中,设计师常常需要将手写签名或扫描图纸转换为CAD格式。本文介绍如何利用Python快速开发图像矢量化工具,实现: 📷 图像自动预处理✏️ 轮廓精确提取⚙️ 参数…...
uniapp微信小程序:WIFI设备配网之TCP/UDP开发AP配网
一、AP配网技术原理 1.1 配网模式选择 AP配网(SoftAP模式)是IoT设备配网成功率最高的方案之一 1、其核心原理: 设备端:启动AP模式(如SSID格式YC3000_XXXX,默认IP192.168.4.1)手…...
docker部署seata
seata版本:2.0.0 使用eureka作为注册中心,mysql作为存储 拉取镜像 docker pull seataio/seata-server:2.0.0mysql建表语句 可从 github下载sql脚本 -- seata_server.branch_table definition CREATE TABLE branch_table (branch_id bigint NOT NULL,…...
JVM 内存分布详解
/*** 示例类,展示各种成员在JVM中的存储位置*/ public class MemoryDistributionExample {// 1. 实例变量(普通成员变量) - 存储在堆内存的对象实例中private int instanceVar 10;private String instanceRef "Instance Reference&quo…...
AR行业应用案例与NXP架构的结合
1. 工业巡检AR头盔 场景示例:宁德核电基地使用AR智能头盔进行设备巡检,通过实时数据叠加和远程指导,将工作效率提升35%。头盔需处理传感器数据、图像渲染和低延迟通信1。 NXP架构支持: 协处理器角色:NXP i.MX RT系列M…...
OpenCV 图形API(49)颜色空间转换-----将 NV12 格式的图像数据转换为 BGR 颜色空间函数NV12toBGR()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从NV12(YUV420p)颜色空间转换为BGR。 该函数将输入图像从NV12颜色空间转换为RGB。Y、U和V通道值的常规范围是0到25…...
Transformer中Post-Norm和Pre-Norm如何选择?
pre-norm: x n 1 x n f ( n o r m ( x n ) ) x_{n1}x_nf(norm(x_n)) xn1xnf(norm(xn)) 其中第二项的方差由于有 norm 是不随层数变化的,于是 x 的方差会在主干上随层数积累。到了深层以后,单层对主干的影响可以视为小量,而不同层的 …...
jvm-描述符与特征签名的区别
在Java虚拟机(JVM)中,存储的是方法签名,而不是仅仅方法描述符。方法签名包含了方法的参数类型和返回值类型的信息,而方法描述符通常指的是仅包含参数类型的那部分信息。为了更清晰地理解这两者的区别以及它们如何在JVM…...
JVM有什么调优参数?
-Xms:堆最小值 -Xmx:堆最大值。-Xms与-Xmx 的单位默认字节都是以k、m做单位的。 通常这两个配置参数相等,避免每次空间不足,动态扩容带来的影响。 -Xmn:新生代大小 -Xss:每个线程池的栈大小。在jdk5以上…...