Android Framework学习二:Activity创建及View绘制流程
文章目录
- Window绘制流程
- Window Manager Service(WMS)
- Surface
- SurfaceFlinger
- 安卓View层次结构
- Activity
- PhoneWindow
- Activity与PhoneWindow两者之间的关系
- ViewRootImpl
- DecorView
- DecorView 的作用
- DecorView 的结构
- 总结
- Activity创建流程
- View invalidate调用流程
Window绘制流程
在安卓系统中,Window Manager Service(WMS)和 Surface 是与窗口管理和图形显示相关的重要概念。
Window Manager Service(WMS)
- 功能概述:WMS 是安卓系统中负责管理窗口的系统服务。它主要负责窗口的创建、销毁、布局、显示顺序以及与用户交互等方面的管理。
- 工作原理:当一个应用程序创建一个窗口(例如 Activity 的界面)时,它会向 WMS 发送请求。WMS 会为该窗口分配一个唯一的标识,并根据窗口的属性(如大小、位置、层级等)将其添加到窗口管理列表中。在绘制窗口时,WMS 会协调各个窗口的位置和显示顺序,确保它们按照正确的方式显示在屏幕上。当用户进行触摸屏幕等交互操作时,WMS 会根据触摸事件的位置和窗口的布局,将事件分发给相应的窗口进行处理。
Surface
- 概念:Surface 是安卓图形系统中的一个重要概念,它代表了一个可绘制的区域,用于在屏幕上显示图形内容。可以将 Surface 看作是一块画布,应用程序可以在上面绘制各种图形、图像和文本等内容。
- 作用:每个窗口都有一个或多个 Surface 与之关联。当应用程序需要绘制窗口的内容时,它会通过 Surface 来获取绘图的上下文,然后使用图形库(如 OpenGL)在 Surface 上进行绘制。绘制完成后,Surface 会将绘制的结果提交给系统的图形合成器(通常是 Surface Flinger),由图形合成器将各个窗口的 Surface 进行合成,最终显示在屏幕上。
- 与 WMS 的关系:WMS 负责管理窗口的整体布局和显示顺序,而 Surface 则是窗口内容绘制的载体。WMS 会根据窗口的状态和用户的操作,通知应用程序更新其 Surface 的内容。例如,当窗口大小发生变化时,WMS 会通知应用程序重新绘制 Surface 以适应新的大小。同时,WMS 也会与 Surface Flinger 协作,确保各个 Surface 能够按照正确的顺序和方式进行合成和显示。
SurfaceFlinger
SurfaceFlinger是 Android 系统中的一个关键服务,主要负责将不同应用程序的 2D、3D surface 进行组合,并将最终合成的图像发送到显示设备进行显示。
安卓View层次结构
Activity包含PhoneWindow、DecorView、ViewRootImpl等
Activity
Activity属于安卓应用程序的四大组件之一,它为用户提供了一个可视化的界面,让用户能够与应用进行交互。每一个Activity都代表着一个屏幕画面,像是登录界面、主界面等。
在安卓中,Activity是由ActivityManagerService(AMS,活动管理器服务) 创建的 。
以下是Activity的一个简单示例:
import android.app.Activity;
import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
PhoneWindow
PhoneWindow是Window类的具体实现,Window类在安卓系统里代表着一个顶级的视觉容器,它负责管理窗口的样式、背景以及标题栏等。PhoneWindow主要处理窗口的具体显示逻辑,例如设置窗口的背景、标题栏、内容视图等。
Activity与PhoneWindow两者之间的关系
- 包含关系:Activity包含一个PhoneWindow对象,在Activity的创建过程中,会默认创建一个PhoneWindow对象。
- 视图关联:Activity通过PhoneWindow来设置和管理其视图。Activity的setContentView()方法实际上是调用了PhoneWindow的setContentView()方法。
// Activity类中的setContentView方法
@Override
public void setContentView(@LayoutRes int layoutResID) {getWindow().setContentView(layoutResID);initWindowDecorActionBar();
}
Activity是用户交互的界面载体,负责处理用户的操作和业务逻辑;PhoneWindow则是窗口的具体实现,负责窗口的显示和管理。它们紧密协作,共同构成了安卓应用程序的用户界面。
ViewRootImpl
- 概述:ViewRootImpl是View与WindowManager之间的桥梁,它不是一个真正的View,但它管理着一个View树的根节点,在Android系统中,每个Window都对应着一个ViewRootImpl实例。
作用 - 视图绘制管理:负责协调View树的绘制过程,包括测量(measure)、布局(layout)和绘制(draw)三个阶段。它会根据屏幕的刷新频率,通过Choreographer来触发视图的重绘,确保界面能够及时更新。
- 事件分发:接收系统传递的输入事件,如触摸事件、按键事件等,并将这些事件分发给View树中的各个View进行处理。它是事件从系统到应用View的重要传递环节。
- 与窗口管理器交互:与WindowManagerService(WMS)进行通信,负责处理窗口的创建、销毁、大小调整等操作。例如,当Activity启动时,ViewRootImpl会与WMS交互来创建窗口,并将DecorView添加到窗口中。
DecorView
在 Android 系统中,DecorView 是窗口(Window)的最顶层视图(顶级 ViewGroup),它作为整个窗口的根视图,包含了系统的装饰(如状态栏、导航栏)和应用程序的内容视图(如 Activity 的布局)。
DecorView 的作用
- 窗口的根容器:每个 Activity 的窗口(PhoneWindow)都包含一个 DecorView,它是 View 层级的最顶层。
- 管理系统 UI:DecorView 负责处理系统窗口装饰(如状态栏、ActionBar/Toolbar)和应用程序内容的协调。
- 内容视图的父容器:开发者通过 setContentView() 设置的布局会被添加到 DecorView 的一个子 ViewGroup(通常是 FrameLayout,ID 为 android.R.id.content)中。
DecorView 的结构
DecorView是每个Activity界面的顶层视图,它是一个FrameLayout。
DecorView 通常包含以下两部分:
- 系统装饰部分
状态栏(Status Bar)、导航栏(Navigation Bar)等系统 UI。
由主题(Theme)控制是否显示(如全屏模式会隐藏系统装饰)。 - 应用内容部分
通过 setContentView() 设置的布局会被添加到 android.R.id.content 这个子 FrameLayout 中。
总结
DecorView 是 Android 窗口系统的核心组件,作为连接系统 UI 和应用内容的桥梁。理解它的结构和功能有助于处理全屏、键盘交互、窗口属性等高级场景。实际开发中,通常只需通过 setContentView() 操作内容部分,而无需直接操作 DecorView。
Activity创建流程
Activity中AMS创建的。
- window的初始化是在 Acticity 创建的时候初始化, 在Acticity对象创建后,会调用attach方法,Windows对象就是这个时候创建的。
- Activity的setContentView其实调用的是PhoneWindow的setContentView。
- setContentView中调用installDecor()进行DecorView的初始化。
- onResume中会调用WindowMangerImpl的addView, ViewRootImpl就是在这个addView中创建的。
- addView会调用ViewRootImpl的setView,setView调用WMS的addView并调用requestLayout。
- requestLayout调用scheduleTraversals(会创建surface),scheduleTraversals调用见下段invalidate流程后段会有讲到主要是调用measure,layout,draw。
如下图为addView流程
View invalidate调用流程
- 起始调用
当我们希望重绘某个View时,直接调用其invalidate方法 。比如在自定义View的事件处理方法(如onClick) 或者数据更新逻辑中调用。invalidate方法会转而调用invalidate(true) ,这里的参数表示是否同时使绘图缓存无效,一般全量刷新时为true。 - invalidateInternal方法
invalidate(true)会调用invalidateInternal方法,此方法会进行以下操作:
判断是否需要重绘:调用skipInvalidate方法判断该View是否不需要重绘,不需要重绘的条件是该View不可见并且未进行动画。
- 处理重绘标志位:进一步判断View是否需要绘制,如判断表达式(mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) ,若满足重绘条件,则处理相关标志位,将当前View标记为 “脏” ,即设置mPrivateFlags中的相关标志,表明该View需要重绘。
- 确定重绘区域:对于开启硬件加速的应用程序,调用父视图的invalidateChild函数绘制整个区域;否则只绘制指定的dirty区域(r变量所指区域)。这是一个向上回溯的过程,每一层的父View都将自己的显示区域与传入的刷新Rect做交集。
- ViewGroup中的调用
- invalidateChild方法:在ViewGroup中,invalidateChild方法会从当前的布局View向上不断遍历其父布局。它会先处理子View重绘相关逻辑,比如根据子View情况设置一些标志位,然后调用父布局的invalidateChildInParent方法。
- invalidateChildInParent方法:该方法会计算需要重绘的区域 ,涉及到location数组(表示自身左边、上边距离父组件的距离,确立在坐标系的相对位置 )和dirty矩形(包含自身宽高,确立需要重绘的面积大小 )。计算后会继续向上请求父布局重绘,直到父布局为ViewRootImpl 。
- ViewRootImpl中的处理
- invalidateChildInParent方法:ViewRootImpl中的invalidateChildInParent方法会检查线程是否正确 ,若dirty为null,表示要重绘整个区域,直接调用invalidate;若dirty为空且没有动画,就不需要重绘,直接返回。否则会对重绘区域进行进一步处理,如根据滚动偏移等情况调整区域。
- invalidate方法:调用invalidate方法后,会通过scheduleTraversals方法安排一次视图遍历。
- 视图遍历与绘制
- scheduleTraversals方法:安排视图遍历工作,将任务添加到消息队列,待合适时机(比如下一次绘制周期 )执行。
- performTraversals方法:视图遍历的核心方法,依次执行测量(performMeasure ,调用measure ,最终到onMeasure )、布局(performLayout ,调用layout ,最终到onLayout )、绘制(performDraw ,调用draw ,最终到onDraw )等步骤 ,完成整个View树的更新绘制 。其中performDraw会进一步调用drawSoftware ,最终触发View的draw方法,开始实际绘制。
Android Framework学习一:系统框架、启动过程
Android Framework学习二:Activity创建及View绘制流程
作者:帅得不敢出门
相关文章:
Android Framework学习二:Activity创建及View绘制流程
文章目录 Window绘制流程Window Manager Service(WMS)SurfaceSurfaceFlinger 安卓View层次结构ActivityPhoneWindowActivity与PhoneWindow两者之间的关系ViewRootImplDecorViewDecorView 的作用DecorView 的结构总结 Activity创建流程View invalidate调用…...
文章五《卷积神经网络(CNN)与图像处理》
文章5:卷积神经网络(CNN)与图像处理——让AI学会"看图说话" 引言:你的AI宠物如何认出猫狗? 想象你的手机突然有了"眼睛",不仅能识别照片里的猫狗,还能告诉你它们的品种&am…...
Ubuntu系统下Firefox浏览器完整指南:故障修复、国内版安装与下载加速
Ubuntu系统下Firefox浏览器完整指南:故障修复、国内版安装与下载加速 一、Firefox无法启动问题修复二、替换国际版安装国内版完整流程准备工作操作步骤验证要点 三、下载延迟问题解决方案现象分析优化配置步骤注意事项 四、进阶技巧补充五、常见问题FAQ 一、Firefox…...
【论文阅读一】掌握高效阅读法,开启学术研究新旅程:S. Keshav教授论文阅读的三遍法
文章目录 一、三遍阅读法1. 初读:10分钟:宏观把握,快速筛选2. 第二遍:1个小时:更仔细的阅读,了解文中论点3. 第三遍:深入理解,注重细节,挑战假设 二、运用三遍阅读法进行…...
多线程编程的常见问题
目录 1. 线程安全和可重入函数问题 2. 死锁的理解 2.1 死锁的概念 2.2 死锁的四个必要条件 3. C中STL容器的线程安全问题 4. C中智能指针的线程安全问题 1. 线程安全和可重入函数问题 线程安全:线程安全是指在多线程环境下,一个函数或者一段代码可…...
算法篇(九)【滑动窗口】
如果在分析一道算法题的时候,发现使用的两个 ”双指针“ , 都是同向的 , 不回退的 , 且一直都在维护 “一段连续的区间” , 此时我们可以考虑使用 “滑动窗口” ! 一、长度最小的子数组 209. 长度最小的子…...
【AI面试准备】传统测试工程师Prompt Engineering转型指南
介绍技能转型:传统测试工程师需掌握Prompt Engineering优化AI输出。如何快速掌握,以及在实际工作中如何运用。 传统测试工程师向AI时代的技能转型,掌握Prompt Engineering(提示工程)已成为提升工作效率、适应智能化测…...
数字智慧方案6186丨智慧应急指挥解决方案(43页PPT)(文末有下载方式)
资料解读:智慧应急指挥解决方案 详细资料请看本解读文章的最后内容。 在当今社会,各类突发事件频发,应急管理工作面临着巨大挑战。智慧应急指挥解决方案应运而生,旨在提升应急管理的效率和水平,保障人民生命财产安全。…...
d202552-sql
一、184. 部门工资最高的员工 - 力扣(LeetCode) 要找到每个部门工资最高的 使用窗口函数 加排序函数 排序函数用rank dense_rank都行 把最高相同的找出来就行 select *, dense_rank() over(partition by departmentId order by Salary desc) as rank …...
cpper 转 java
快速上手 java 特性 文章目录 java 语言特点JVM工作过程组成 java 语言特点 Java 程序编译成字节码,然后由 Java 虚拟机(JVM)执行 不同平台适配相同的 JVM ,从而使得 Java 程序具备跨平台性 —— 一次编写,到处运行 …...
PostgreSQL常用函数
常用函数 数值函数 名称作用AVG(col)列的平均值COUNT(col)列的行数MAX(col)列的最大值MIN(col)列的最小值SUM(col)列值求和 字符串函数 名称作用LENGTH(str)计算字符串长度CONCAT(str1,str2)合并字符串LTRIM(col,str)从字串string的开头删除只包含str(默认空白LTRIM(col))R…...
P2196 [NOIP 1996 提高组] 挖地雷
P2196 [NOIP 1996 提高组] 挖地雷 - 洛谷 题目描述 在一个地图上有N(N ≤ 20)个地窖,每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷&#…...
截图软件、画图软件、左右分屏快捷键
截图软件 画图软件 画图时候按字母可以改变颜色:红色r,蓝色b,绿色g,粉色p,橙色o 左右分屏:...
小刚说C语言刷题—1018三角形类别
1.题目描述 输入三个整数,以这三个数为边长,判断是否构成三角形;若不能输出 no 。 若构成三角形,进一步判断它们构的是:锐角三角形或直角三角形或钝角三角形。 分别输出 ruijiao , zhijiao , dunjiao 。 输入 三个…...
【Linux】PetaLinux开发
使用Xilinx的PetaLinux工具编译用于Zynq7020的Linux. 部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 一般开发流程 2 离线编译过程 3 系统根文…...
【计算机网络网络层深度解析】从IP协议到路由优化
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心实验实现实验1:IPv6地址配置实验2:OSPF路由配置实验3:NAT转换验证 运行…...
第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年真题
一、选择题 第 1 题 题目:下列符号中哪个在 C++ 中表示行注释 ( )。 A. ! B. # C. ] D. // 正确答案:D 答案解析: 在 C++ 中,//用于单行注释(行注释),从//开始到行末的内容会被编译器忽略。选项 A(!)、B(#)、C(])均无注释功能,其中#常用于预处理指令(如#inclu…...
【quantity】5 derive_more库 2.0 版介绍
derive_more 是一个 Rust 过程宏库,旨在通过派生宏自动生成常见 trait 的实现,减少样板代码。2.0 版本带来了多项改进和新特性。 主要特性 1. 支持的 Trait 派生 derive_more 2.0 支持派生以下 trait: 基本操作 trait: Display - 格式化显…...
Qt编译报错:Unexpected compiler version, expected Clang 18.0.0 or newer——Qt安装MSVC编译器
截止到本人所使用的Qt6.6.3为止,Qt尚不支持MSVC2022编译器的默认编译器配制。所以,在Qt构建套件中使用MSVC编译器的话,可能仍需要调整Visual Studio版本,或者手动设置MSVC编译器。 如果你的系统安装的是Visual Studio2022&#x…...
(转)角色与动画的性能优化 | UnrealFest演讲干货
八、蓝图 8.1. Tick 优化的重点关注对象——Tick事件。在不需要的情况下,请默认关闭Tick。 在蓝图中Actor上关掉还不行,Component也需要关掉。 在CPP中,我们可以从PrimaryActorTick或PrimaryComponentTick中关闭Tick。 如果需要Tick&…...
小程序云开发-环境配置
如果点 云开发 没有反应,需要修改软件安装目录不要有中文,但软件名可以是中文: 首次使用,会送1个月的云开发,配置后要等10分钟以后,才可以使用 如果不能选择环境,关掉重新打开一次。 然后记…...
【c++】【STL】priority_queue详解
目录 priority_queue的作用priority_queue的接口构造函数emptysizetoppushpopswap priority_queue的实现仿函数(函数对象)是什么?向上调整算法(adjustup)向下调整算法(adjustdown)迭代器构造pus…...
C语音中的三元运算符
一、三元运算符的基本语法 三元运算符,也被称为条件运算符,是 C 语言中唯一有三个操作数的运算符。它的语法格式为:condition ? expression1 : expression2。从语法结构可以看出,三元运算符由一个条件表达式和两个普通表达式组…...
C++模板知识
目录 引言 一、非类型模板参数 二、类模板的特化 (一)概念 (二)函数模板特化 (三)类模板特化 1. 全特化 2. 偏特化 (四)类模板特化应用示例 三、模板的分离编译 …...
MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式…...
文本中地理位置提取方法—正则和NLP模型
这里写目录标题 一、提取地址列后12个字二、正则表达式删除不需要的文本三、保留关键字并删除之后的字四、相似度计算,查重五、去重 大量的文本中识别数据,要充分考虑效率和准确率。本文的方案是通过正则和NLP门址模型联合识别的方案。 首先利用现有粗略…...
AI大模型-RAG到底能做些什么?
RAG常见的应用场景,有以下几个方面: 1.智能客服系统:比如电商领域,对客户提出的常见问题,进行自动回复。减少人力成本。 2.人力资源管理:一个新的员工,入职一家大型公司,公司中有各…...
【算法基础】冒泡排序算法 - JAVA
一、算法基础 1.1 什么是冒泡排序 冒泡排序是一种简单直观的比较排序算法。它重复地走访待排序的数列,依次比较相邻两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。 1.2 基本思想 比较相邻元素:从头开始…...
Nginx搭建test服务器
创建test域名 进入阿里云添加解析 创建域名:test.xxxxx.com 服务器复制项目代码 新建目录,Git拉取项目代码,安装上插件包 修改配置文件,启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "t…...
依赖倒置原则
当然可以!这次我们来详细讲解 依赖倒置原则(DIP: Dependency Inversion Principle),它是 SOLID 五大设计原则中的压轴,也是最关键的“架构型原则”。 我将从: 什么是依赖倒置原则(定义&#x…...
PostgreSQL 的 VACUUM 与 VACUUM FULL 详解
PostgreSQL 的 VACUUM 与 VACUUM FULL 详解 一、基本概念对比 特性VACUUMVACUUM FULL定义常规维护操作,清理死元组激进重组操作,完全重写表数据锁级别不阻塞读写(共享锁)排他锁(阻塞所有操作)空间回收只标记空间为可用,不返还OS空间返还操作…...
SQL面试题——留存分析之使用bitmap 计算留存
使用bitmap 计算留存 之前我们说过,留存分析其实在企业数据分析中,是很基础但是也很重要的,留存分析可以反映产品的发展是否健康,是否可持续发展,之前我们介绍过,可以看看之前的文章 SQL面试题——留存分析 因为使用工具的限制,所以我们实现方式也会有所不同,之前我们…...
P2415集合求和 题解
P2415 集合求和 题解 公式推导: 设集合有 n 个元素,记为 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an。 每个子集要么包含某个元素,要么不包含。 我们固定某个元素 a k a_k ak,再从剩下的 n − 1 n -…...
【2025年五一数学建模竞赛】C题 完整论文 模型建立与求解
目录 2025年五一数学建模竞赛 C题完整论文:建模与求解 Matlab代码一、问题重述二、模型假设与符号说明2.1 模型基本假设2.2 符号说明 问题一:预测博主新增关注数问题二:预测用户的新关注行为问题三:预测用户在线状态及互动博主问题…...
wpf 输入框 在输入时去除水印
wpf ScrollViewer 在输入数据时去除水印 在WPF(Windows Presentation Foundation)中,ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入(例如文本输入),并且希望在输入时去除水…...
数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)
资料解读:智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展,智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验,还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…...
C语言-指针(二)
一级指针 一级指针指的是存储了变量地址的指针 一级指针的变量类型是 类型 * 一级指针的类型与变量的类型有些不同 例:int * p 前面的int * 是该地址的类型 int a 0; int * p a; 这里的指针 p 就是一级指针 二级指针 指针变量也是变量因此也会有地…...
React 组件prop添加类型
给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…...
Spring Boot中集成Guava Cache或者Caffeine
一、在Spring Boot(1.x版本)中集成Guava Cache 注意: Spring Boot 2.x用户:优先使用Caffeine,性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖: <dependency><groupId>com.google.guava</groupId&…...
全感官交互革命:当 AI 大模型学会 “看、听、说、创”
引言:从 “文字对话” 到 “全感官体验”,AI 正在重塑人类认知边界 当 AI 不再局限于文本对话,而是能 “看懂” 图像、“听懂” 语音、“生成” 视频,并将这些模态无缝融合时,一场关于人机交互的革命已然开启。DeepSe…...
Linux 库文件详解
Linux 库文件详解 一、库文件概述 库文件是预先编译好的方法的集合,它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中,主要有两种类型的库文件:静态库和共享库。 静态库(.a 文件) 使用静态库࿰…...
蒙特卡罗方法(Monte Carlo Method):基于随机采样的数值计算与模拟技术
核心思想 蒙特卡罗方法通过随机采样和统计模拟解决数学、物理、工程等领域的复杂问题,其核心是利用大数定律——当样本量足够大时,样本均值会收敛于期望值。 关键特点: 无维度诅咒&#x…...
HTTPS协议:更安全的HTTP
目录 1. 前言 2. HTTP 与 HTTPS:安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客:对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程:建立安全通道的关键步骤 3.3 数字证书ÿ…...
Flutter BottomNavigationBar 详解
目录 一、引言 二、BottomNavigationBar 的基本用法 三、主要属性 1. 基本配置 2. 导航项配置 3. 导航类型选择 四、高级功能实现 1. 结合 PageView 实现滑动切换 2. 添加徽章提示 3. 自定义凸起按钮(FAB融合) 4. 渐变背景实现 五、自定义 B…...
吴恩达深度学习作业 RNN模型——字母级语言模型
一. 简单复习一下RNN RNN RNN适用于处理序列数据,令是序列的第i个元素,那么就是一个长度为的序列,NLP中最常见的元素是单词,对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时,为了表示序列的…...
数字时代,如何为个人信息与隐私筑牢安全防线?
首席数据官高鹏律师团队编著 在当今数字化时代,个人信息和隐私保护至关重要。我们在享受数字生活带来的便利时,也面临着个人信息泄露、隐私被侵犯的风险。下面将从先进技术和法律途径两个方面,探讨如何严格保护个人信息和隐私。 一、先进技…...
javascript交换值最好三种
代码 1. 位运算(性能高,但只能用于整数) var a15; var b32; console.log(a) //15 console.log(b) //32 a a ^ b; b a ^ b; a a ^ b; console.log(a) //32 console.log(b) //152. 数组结构(性能高,但要ES6) var a15; var b32; console.log(…...
C++-Lambda表达式
目录 1.什么是 Lambda? 2.例子:打印每个元素(和 for_each 一起用) 3.捕获外部变量(Capture) 3.1. 捕获值(拷贝):[] 3.2. 捕获引用:[&] 3.3. 指定捕…...
逻辑回归的多分类实战:以鸢尾花数据集为例
文章目录 引言:从二分类到多分类一、多分类问题无处不在二、One-vs-All策略揭秘1. 核心思想2. 数学表达 三、鸢尾花分类完整实现1. 环境准备2. 数据加载与探索3. 数据预处理4. 模型训练与评估5. 决策边界可视化 四、关键参数解析五、总结 引言:从二分类到…...
[面试]SoC验证工程师面试常见问题(一)
SoC验证工程师面试常见问题(一) 摘要:在面试 SoC 验证工程师职位时,面试官通常会重点考察候选人对 SystemVerilog 和 UVM (Universal Verification Methodology) 的掌握程度,因为这两者是现代 IC 验证的核心技能。以下是可能会被问到的常见问题,涵盖 SystemVerilo…...