OpenHarmony ArkUI Toggle组件实战:红蓝药丸选择器开发详解

news2026/5/18 11:09:10
1. 项目概述与设计思路最近在整理OpenHarmony应用开发的学习笔记发现很多初学者在接触到ArkUI的声明式开发范式时对于如何将UI组件与用户交互、状态管理结合起来总感觉隔着一层纱。理论看了不少但一到自己动手就不知道如何把一个个零散的控件串联成一个有逻辑、有反馈的完整功能。这让我想起了当年学习时的自己所以决定用一个有趣且视觉反馈强烈的例子来拆解这个过程。这次我们不写枯燥的计数器或者TODO List而是来玩一个“黑客帝国”式的经典选择蓝药丸还是红药丸这个项目麻雀虽小五脏俱全它涵盖了图片资源管理、布局容器、Toggle开关组件的多种样式、事件绑定、状态驱动UI更新以及条件渲染的初步思想非常适合用来理解ArkUI eTS开发的核心链路。整个应用的目标很明确构建一个沉浸式的选择场景。用户面对两个代表不同命运的开关红药丸与蓝药丸做出选择后界面背景图片会随之切换营造出截然不同的氛围——选择红色进入《黑客帝国》的代码世界选择蓝色则进入温馨的“宝宝巴士”卡通世界。同时我们还需要加入一个“同意协议”的复选框模拟真实应用中常见的用户确认环节。这个项目虽然界面不复杂但能让你清晰地看到从用户点击一个开关到整个界面发生变化这中间数据是如何流动视图是如何响应的。这正是声明式UI的精髓你只需要关心状态是什么UI就会自动变成它该有的样子。2. 核心控件Toggle开关的深度解析在OpenHarmony的ArkUI eTS框架中Toggle组件是构建交互式选择控件的利器。它远比一个简单的开关要强大提供了多种样式以适应不同的设计场景。理解它的每一种形态和配置项是灵活运用它的前提。2.1 Toggle的三种类型与适用场景Toggle组件主要通过type参数来定义其外观目前主要支持三种类型这在官方文档的接口定义ToggleInterface({ type: ToggleType, isOn?: boolean })中已经点明。选择哪种类型直接决定了组件的视觉呈现和交互隐喻。ToggleType.Switch开关样式这是我们最熟悉的样式也是本次项目的核心。它模拟了物理开关的滑动效果具有明确的“开”与“关”两种状态。在UI设计上它通常用于表示一个系统功能或设置的启用与禁用其状态改变会立即生效。例如手机的Wi-Fi开关、夜间模式开关。在本项目中我们用两个Switch样式的Toggle来代表“红药丸”和“蓝药丸”暗示这是一个非此即彼、具有明确后果的重大选择。它的视觉反馈强烈滑动动画能给予用户清晰的操作确认感。ToggleType.Checkbox复选框样式这就是常见的方框勾选样式。它通常用于一组非互斥的选项用户可以同时选择多个。例如填写表单时选择兴趣爱好或者软件安装时选择附加组件。在本项目中我们用它来实现“我同意选择绝不后悔”这个协议确认。使用Checkbox而不是Switch更符合用户对于“阅读并同意条款”这一行为的认知习惯——它是一个需要主动勾选的确认动作而非一个功能开关。ToggleType.Button按钮样式这种样式让Toggle看起来像一个状态按钮按下后保持选中状态再次按下则取消选中。它适用于模式切换比如文本编辑器的“加粗”、“斜体”按钮。虽然本项目未使用但了解它有助于你在其他场景下做出正确选择。例如一个图片滤镜的“怀旧模式”开关用Button样式就比Switch样式更贴合语境。注意ToggleType的定义来源于ohos.arkui.advancedUI模块对于API version 9及以上可能路径有所不同建议查阅对应SDK版本的文档。在实际开发中通常不需要显式导入因为框架已全局注入这些类型。但如果你遇到类型未定义的错误请检查SDK版本和导入语句。2.2 关键属性与事件绑定实战理解了类型我们再来看看如何通过属性和事件让Toggle“活”起来。属性控制其静态外观事件则响应用户的动态交互。核心属性配置selectedColor: 这个属性用于设置组件在“打开”isOn为true状态时的背景颜色。对于Switch类型它改变的是开关滑轨的背景色对于Checkbox它改变的是勾选标记的颜色。在本项目中我们为红色药丸的Toggle设置了selectedColor(Color.Red)为蓝色药丸的设置了selectedColor(Color.Blue)这使得开关的状态在视觉上与药丸颜色强关联。switchPointColor: 这是一个专属于ToggleType.Switch的属性。它用于设置开关上那个可滑动的圆形滑块的颜色。通过将它也设置为红或蓝我们让整个开关控件在颜色主题上保持了高度一致增强了UI的整体感。isOn: 初始化参数用于设置Toggle的初始状态。默认是false关闭。你可以通过这个参数来恢复用户上次的选择实现状态持久化。灵魂所在onChange事件Toggle组件最核心的交互能力来自于onChange事件。它是一个回调函数当用户操作导致Toggle的开关状态发生变化时这个函数就会被调用。回调函数会接收到一个布尔值参数isOn它明确告知开发者当前Toggle是开true还是关false。Toggle({ type: ToggleType.Switch }) .selectedColor(Color.Red) .switchPointColor(Color.Red) .onChange((isOn: boolean) { // 当这个红色开关的状态改变时此处的代码会被执行 console.info(红色药丸开关状态变为: ${isOn}); // 在这里我们可以根据isOn的值去更新其他组件的状态 if (isOn) { // 如果红色开关被打开了我们可能需要关闭蓝色开关并切换图片 } })在这个事件回调函数里你可以编写任何逻辑更新其他组件的状态、发送网络请求、保存数据到本地或者像我们项目里做的那样改变一个State装饰的变量从而驱动整个UI的刷新。这就是ArkUI响应式编程的起点——用户交互触发事件事件处理函数修改状态状态变化自动更新UI。3. 项目UI构建与布局实战有了对Toggle的深入理解我们就可以开始搭建整个选择场景的界面了。一个好的UI不仅仅是控件的堆砌更需要合理的布局和层次感来引导用户的视线和操作流程。3.1 资源准备与基础框架搭建任何应用的开发资源管理都是第一步。在OpenHarmony应用项目中图片、音频等媒体资源通常存放在entry/src/main/resources/base/media/目录下。你需要将代表不同场景的图片例如matrix.jpg和babybus.jpg复制到这个目录。在eTS代码中我们使用$r(app.media.[文件名])这个系统函数来引用这些资源。$r是资源访问的快捷方式它会在编译时被替换为正确的资源索引确保应用在不同设备密度下的适配性。项目的基础布局我们选择Column容器。Column是纵向排列其子组件的容器类似于Web中的Flexbox的column方向。我们将Column的宽高都设置为‘100%’使其铺满整个屏幕作为我们UI的根布局。Entry Component struct PillChoicePage { build() { Column() { // 所有的UI组件都将作为Column的子组件在这里纵向排列 } .width(100%) .height(100%) .backgroundColor(Color.White) // 可以设置一个默认背景色 } }3.2 层次化布局与组件属性详解我们的界面从上到下大致分为四个部分背景图、标题、药丸选择区、协议确认区。我们需要使用不同的布局容器和组件属性来实现这个结构。1. 背景图片Image组件首先我们在Column的顶部放置一个Image组件来展示场景图。这里引入一个非常重要的概念尺寸单位的百分比设置。.width(‘100%’)意味着图片的宽度将占满其父容器即Column宽度的100%。这是一种响应式的设计方法无论屏幕宽度是360px还是1080px图片都能自适应宽度。高度我们固定为240这是一个经验值能在大多数屏幕上提供不错的视觉占比。使用百分比和固定值结合是构建自适应UI的常用手段。2. 标题文本Text组件在图片下方我们添加一个Text组件来显示提示语“请选择你的药丸”。这里我们使用了几个关键属性.fontSize(30)设置字体大小。在ArkUI中字体大小默认单位是fp字体像素它会根据系统的字体大小设置进行缩放具有良好的无障碍支持。.margin({top:10})设置外边距。这里我们只设置了顶部间距为10在图片和标题之间创造一点呼吸空间。margin可以接受一个对象分别指定top,right,bottom,left四个方向的间距。.backgroundColor(Color.Gray)和.fontColor(Color.White)分别设置文本的背景色和字体颜色。强烈的对比色能让标题更加醒目。3. 药丸选择区Row容器与Toggle组合接下来是核心交互区。我们希望红色和蓝色药丸的开关并排显示因此需要使用Row容器。Row会将其子组件在水平方向上依次排列。Row() { // 红色药丸开关组 Toggle({ type: ToggleType.Switch }) .selectedColor(Color.Red) .switchPointColor(Color.Red) .onChange((isOn: boolean) { // 事件处理逻辑稍后详解 }) Text(红色) .fontSize(30) .fontColor(Color.Red) // 蓝色药丸开关组 Toggle({ type: ToggleType.Switch }) .selectedColor(Color.Blue) .switchPointColor(Color.Blue) .onChange((isOn: boolean) { // 事件处理逻辑稍后详解 }) Text(蓝色) .fontSize(30) .fontColor(Color.Blue) } .justifyContent(FlexAlign.SpaceEvenly) // 关键布局属性 .width(100%) .margin({ top: 30 })这里有一个至关重要的布局属性.justifyContent(FlexAlign.SpaceEvenly)。它定义了Row容器内子组件在主轴水平方向上的对齐方式。SpaceEvenly意味着浏览器会平均分配所有子组件及其周围的空间使得每个子组件之间的间隔相等并且第一个组件前和最后一个组件后的空间也与间隔相等。这确保了“红药丸”和“蓝药丸”两个选择在水平方向上均匀、美观地分布而不是挤在左边或右边。4. 协议确认区与间距控制Blank组件在药丸选择区和协议确认区之间我们感觉间距不够直接放下去显得很拥挤。这时Blank组件就派上用场了。Blank是一个空白的填充组件它本身没有内容但可以设置宽高来占位。我们插入一个Blank().height(150)就在上下两个Row之间强行撑开了150像素的高度让界面布局有了节奏感。协议确认区本身也是一个Row里面包含一个Checkbox样式的Toggle和一个说明文本。注意这里我们对Toggle使用了.size({ width: 28, height: 28 })来精确控制复选框的大小使其与常见的UI设计规范相符。4. 状态管理与交互逻辑实现界面搭建好了但现在是静态的。如何让选择红蓝药丸时背景图片动态变化如何让两个开关互斥选择了红蓝就自动关闭这就需要引入ArkUI的核心概念之一状态管理。4.1 使用State驱动UI更新在ArkUI的声明式UI范式中UI是应用状态的函数。当状态改变时框架会自动重新计算并更新相关的UI部分。State装饰器就是用来定义组件内部状态的最常用工具。被State装饰的变量当其值发生改变时会触发其所在组件的build方法重新执行从而更新UI。在本项目中我们需要一个状态变量来记录当前应该显示哪张图片。State currentBgImage: Resource $r(app.media.matrix_red); // 初始图片 build() { Column() { Image(this.currentBgImage) // Image组件的数据源绑定到状态变量 .width(100%) .height(240) // ... 其他组件 } }我们将Image组件的src属性绑定到this.currentBgImage。初始状态是红色药丸对应的图片。接下来我们要在Toggle的onChange事件中修改这个状态。4.2 实现互斥选择与图片切换现在我们需要处理两个开关的交互逻辑。它们应该是互斥的就像单选按钮一样。同时切换时还要改变背景图。我们通过修改状态变量来实现。首先我们可能需要两个状态变量来分别记录红蓝开关的状态但更优雅的方式是使用一个状态变量来记录当前选择的“药丸类型”。State currentPill: string none; // red, blue, or none State isAgreed: boolean false; // 协议是否同意 // 红色开关的事件处理 Toggle({ type: ToggleType.Switch }) .selectedColor(Color.Red) .switchPointColor(Color.Red) .isOn(this.currentPill red) // 开关状态绑定到currentPill .onChange((isOn: boolean) { if (isOn) { this.currentPill red; this.currentBgImage $r(app.media.matrix_red); } else if (this.currentPill red) { // 如果当前是红色被关闭且没有其他选择可以置为none this.currentPill none; } }) // 蓝色开关的事件处理 Toggle({ type: ToggleType.Switch }) .selectedColor(Color.Blue) .switchPointColor(Color.Blue) .isOn(this.currentPill blue) // 开关状态绑定到currentPill .onChange((isOn: boolean) { if (isOn) { this.currentPill blue; this.currentBgImage $r(app.media.babybus_blue); } else if (this.currentPill blue) { this.currentPill none; } })注意我们将每个Toggle的.isOn属性也绑定到了状态this.currentPill。当currentPill变为‘red’时红色Toggle的isOn会通过绑定自动变为true蓝色Toggle的自动变为false。这样UI状态和业务状态就保持了一致。在onChange事件里我们根据操作来更新currentPill和currentBgImage。这种模式是ArkUI开发的典型模式事件回调修改状态状态变化驱动UI更新。4.3 协议复选框的联动进阶思考上面的代码实现了一个基本功能。但我们可以做得更完善。比如是否可以设置只有勾选了“同意协议”后红蓝药丸的选择才生效这涉及到组件间的状态联动。我们可以修改红蓝Toggle的onChange事件先检查this.isAgreed是否为true。.onChange((isOn: boolean) { if (!this.isAgreed) { // 如果未同意协议弹个提示并且不让开关状态改变 prompt.showToast({ message: 请先同意协议 }); // 这里需要阻止状态更新吗实际上Toggle的isOn已经因为用户操作而试图改变。 // 更优的做法是使用自定义组件或禁用属性但这里为了简单我们可以在事件里不修改currentPill。 // 然而Toggle的UI已经变化了这会造成不一致。所以更好的方法是使用.enabled属性。 return; } // ... 原有的选择逻辑 })更专业的做法是动态设置Toggle的.enabled(false)属性当协议未勾选时禁用两个药丸开关。Toggle({ type: ToggleType.Switch }) .enabled(this.isAgreed) // 绑定到协议状态 .selectedColor(Color.Red) // ... 其他属性而协议复选框的状态isAgreed则由另一个State变量管理并绑定到对应的Checkbox Toggle上。State isAgreed: boolean false; // 在协议复选框处 Toggle({ type: ToggleType.Checkbox, isOn: this.isAgreed }) .size({ width: 28, height: 28 }) .onChange((value: boolean) { this.isAgreed value; })这样整个应用的交互逻辑就形成了一个清晰的闭环协议复选框控制着主选择区的可用状态主选择区的操作又驱动着背景图片的切换。所有变化都通过State变量这个“单一数据源”来协调保证了UI与数据的一致性。5. 开发调试与常见问题排查在实际编码和预览过程中你可能会遇到一些问题。这里我总结了一些常见的情况和排查思路希望能帮你少走弯路。5.1 资源文件找不到或图片不显示这是初学者最高频的问题。症状是代码没有报错但图片位置一片空白。检查路径和文件名首先确认图片文件是否放入了entry/src/main/resources/base/media/目录。然后检查代码中$r(‘app.media.xxx’)里的xxx是否与文件名不含后缀完全一致区分大小写。例如文件是Matrix.jpg引用就应该是$r(‘app.media.Matrix’)。检查资源格式OpenHarmony对图片格式有要求通常支持PNG、JPG、WEBP等。确保图片格式是受支持的。可以尝试换一张简单的PNG图片测试。清理构建缓存有时IDE或构建工具缓存会导致资源索引失败。可以尝试执行菜单中的Build - Clean Project或Build - Rebuild Project。查看日志在DevEco Studio的Log窗口过滤Image相关的标签看是否有加载失败的报错信息。5.2 布局错乱或不符合预期容器属性未生效确保布局属性如.justifyContent(),.alignItems()是设置在容器组件Column,Row,Flex上而不是设置在子组件上。尺寸设置冲突同时设置了width(‘100%’)和固定的margin或padding可能会在部分容器中导致溢出。理解盒模型组件总宽度 widthmarginpaddingborder。Row/Column嵌套过深复杂的布局可能导致渲染性能下降或意料之外的对齐。尽量简化布局层级对于复杂界面考虑使用Grid、List或Swiper等更专业的容器。Blank组件不生效Blank必须放在容器内才能起到占位作用。确保它没有被错误的样式覆盖比如父容器设置了固定的高度。5.3 状态更新了但UI不刷新这是理解响应式机制的关键。检查变量是否被State装饰只有被State、Link、Prop等装饰器装饰的变量其变化才会被框架观察到并触发UI更新。普通变量修改不会引起重渲染。检查修改方式对于对象或数组直接修改其内部属性如this.someObject.key newValue框架可能无法感知。应该使用返回新对象的方式例如this.someObject { …this.someObject, key: newValue }。对于数组使用push等方法修改后也需要执行this.array […this.array]来触发更新。build方法中的逻辑避免在build方法中执行会修改状态的操作这可能导致无限循环渲染。5.4 Toggle事件与状态绑定问题开关状态不同步如同我们在4.2节实现的如果你手动修改了currentPill但Toggle的UI没变是因为Toggle的isOn属性没有绑定到状态变量。你需要使用.isOn(this.currentPill ‘red’)这样的方式建立双向绑定。注意在onChange事件中修改状态状态变化又会通过.isOn绑定更新UI形成一个循环要确保逻辑不会导致死循环例如在onChange里无条件地设置isOn为相反值又触发onChange。事件被多次触发在互斥逻辑中当你选择红色开关时它的onChange触发将currentPill设为‘red’。由于蓝色开关的.isOn绑定到了this.currentPill ‘blue’这个条件从true变为false理论上也会触发蓝色开关的onChange事件。如果你在蓝色开关的onChange里写了逻辑比如弹窗就会被意外执行。在设计互斥逻辑时要小心这种由状态绑定引发的连锁事件反应。5.5 真机调试与样式适配在预览器上正常真机上异常预览器Previewer和真机/模拟器Remote Emulator的运行环境有细微差别。真机调试是最终测试的必备环节。通过DevEco Studio的Tools - Device Manager连接设备进行调试。样式在不同设备上大小不一致尽量使用百分比‘100%’、vp虚拟像素基于屏幕密度和fp字体像素这类相对单位避免大量使用固定的px像素单位。vp和fp会根据屏幕的像素密度dpi自动缩放能更好地适配不同分辨率的设备。6. 项目扩展与优化思路完成基础版本后这个“药丸选择器”还有很多可以打磨和扩展的地方这能让你更深入地练习eTS和ArkUI。1. 动画效果增强目前切换图片是瞬间完成的可以增加过渡动画让体验更平滑。ArkUI提供了丰富的动画API。例如可以为Image组件添加一个透明度opacity或缩放scale的动画。Image(this.currentBgImage) .width(‘100%’) .height(240) .transition({ type: TransitionType.All, duration: 500, curve: Curve.EaseInOut }).transition可以为该组件所有可动画属性如宽高、位置、透明度、背景色等的变化添加平滑过渡。当currentBgImage切换导致Image组件重新渲染时新图片会以淡入淡出的方式呈现持续500毫秒。2. 状态持久化应用关闭再打开用户之前的选择就丢失了。我们可以使用轻量级存储Preferences来保存用户的选择和协议同意状态。import preferences from ‘ohos.data.preferences’; // 在aboutToAppear生命周期中读取数据 async aboutToAppear() { try { let prefs await preferences.getPreferences(this.context, ‘mypillchoice’); let savedPill await prefs.get(‘currentPill’, ‘none’); this.currentPill savedPill as string; // 根据savedPill恢复图片 } catch (err) { console.error(‘读取偏好设置失败:’, err); } } // 在用户做出选择时保存数据 .onChange(async (isOn: boolean) { if (isOn) { this.currentPill ‘red’; try { let prefs await preferences.getPreferences(this.context, ‘mypillchoice’); await prefs.put(‘currentPill’, ‘red’); await prefs.flush(); // 提交更改 } catch (err) { console.error(‘保存偏好设置失败:’, err); } } })3. 更复杂的交互反馈例如当用户做出选择后不仅可以切换背景图还可以播放一段对应的音效或者弹出一个富有仪式感的对话框显示“你选择了现实/虚拟世界…”。这需要用到AudioPlayer音频播放接口和AlertDialog弹窗组件。将这些能力集成进来就是一个功能更丰满的小应用。4. 组件化重构当页面逻辑变复杂后可以考虑将“药丸选择按钮组”和“协议确认栏”分别抽离成自定义组件Component。这样主页面的结构会更清晰抽离出的组件也可以在别的页面复用。这是构建中大型应用的必要技能。这个“红蓝药丸”项目虽然看似简单但它像一把钥匙帮你打开了OpenHarmony ArkUI应用开发的大门。从资源管理、基础布局、组件使用到状态管理、事件响应、交互逻辑最后再到问题排查和优化思路它串联起了入门阶段最核心的知识点。我建议你在实现基础功能后一定要亲手尝试上面提到的一两个扩展点过程中遇到的问题和解决过程才是你真正积累下来的经验。开发就是这样从一个简单的“Hello World”和一个有趣的“药丸选择”开始一步步构建出越来越复杂和强大的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2621433.html

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…