Unity移动端输入框适配:动态避让键盘与异形屏安全区域实战
1. 项目概述为什么移动端输入框适配是个“老大难”问题做Unity移动端开发的朋友尤其是做过社交、电商、表单这类强交互应用的朋友一定对这个场景不陌生用户点击屏幕下方的输入框虚拟键盘弹起结果输入框被键盘严严实实地盖住了。用户只能“盲打”或者需要手动滑动界面才能看到自己输入的内容体验极其糟糕。这还只是“常规”全面屏手机上的问题。当你的应用跑在那些有刘海、水滴、挖孔或者屏幕四角有巨大弧度的“异形屏”设备上时问题会变得更加复杂——输入框可能被刘海遮挡或者因为安全区域Safe Area计算不当导致UI元素显示在不可点击或不可见的区域。这个项目就是来解决这个“老大难”问题的。核心目标有两个一是动态调整输入框位置确保在任何型号的手机上当键盘弹出时输入框都能自动、平滑地移动到键盘上方可视区域二是完美适配异形屏确保所有UI元素特别是底部的按钮和输入框能正确避开屏幕的刘海、圆角和底部手势条Home Indicator区域。这不仅仅是让界面“看起来没问题”更是保证应用交互逻辑顺畅、用户操作无阻的基础。无论是IM聊天、评论发表还是登录注册流程一个聪明的输入框适配方案能直接提升产品的专业度和用户体验。2. 核心思路拆解从被动响应到主动布局在深入代码之前我们先理清解决这个问题的核心思路。很多新手会尝试用“打补丁”的方式比如监听键盘高度然后硬生生把整个UI画布Canvas往上推。这种方法简单粗暴但后患无穷尤其是在复杂UI和异形屏环境下。2.1 动态调整输入框位置的正确姿势我们的目标不是移动整个UI而是让输入框所在的局部区域通常是其父级容器产生位移。这样做的优势非常明显第一对界面其他部分干扰最小第二动画效果可以做得更精细第三逻辑更清晰易于维护。实现这一点的关键流程是监听键盘事件在Unity中我们需要通过特定接口如TouchScreenKeyboard或第三方插件来获取键盘的显示/隐藏状态以及其准确高度。在Android和iOS上获取键盘高度的方式有所不同需要平台特定代码。计算目标位置当键盘弹出时我们需要计算输入框底部到屏幕底部的距离并与键盘高度进行比较。如果距离小于键盘高度说明输入框会被遮挡此时需要计算一个偏移量Offset。执行平滑移动将计算出的偏移量应用给输入框的父级RectTransform。为了有更好的用户体验我们应该使用DOTween或LeanTween这类插件实现一个缓动Easing动画而不是瞬间跳变。键盘收起时复位当键盘隐藏时将父级容器动画移回原始位置。注意这里有一个非常重要的细节——键盘高度在不同设备、不同输入法、甚至不同系统主题下都可能不同。因此绝对不能写死一个键盘高度值。必须通过运行时动态获取。2.2 异形屏适配的本质理解 Safe Area异形屏适配的核心概念是安全区域Safe Area。这是屏幕上一块保证内容不会被设备的物理特征刘海、圆角、摄像头或系统UI手势指示条遮挡的矩形区域。对于Unity开发而言我们需要做的是获取当前设备的安全区域数据。在iOS上使用Screen.safeAreaUnity 2017.2可以直接获取一个Rect。在Android上情况复杂得多因为安卓厂商碎片化严重刘海形状各异通常需要调用原生Android Java代码来获取。将安全区域数据应用到UI布局。最推荐、最灵活的方式不是直接修改每个UI元素而是创建一个“安全区域适配器”。这个适配器通常是一个全屏的Panel其锚点Anchor拉伸到整个屏幕然后根据获取到的安全区域Rect通过修改其RectTransform的offsetMin和offsetMax属性来“挖掉”不安全的部分。所有需要避开异形区域的UI元素都作为这个适配器的子物体。这样我们只需要在一处安全区域适配器处理平台差异所有子UI元素会自动被约束在安全区域内一劳永逸。3. 实战构建动态键盘适配模块理论清晰了我们开始动手。首先构建动态键盘适配模块。这里我会提供一个兼顾iOS和Android的通用性方案。3.1 创建输入框适配器组件我们创建一个名为InputFieldAdapter的MonoBehaviour脚本挂载在输入框的父级容器上比如一个专门用于包裹输入框和发送按钮的Panel。using UnityEngine; using UnityEngine.UI; using DG.Tweening; // 使用DOTween做动画需先导入Asset [RequireComponent(typeof(RectTransform))] public class InputFieldAdapter : MonoBehaviour { public InputField targetInputField; // 需要适配的输入框 public float additionalOffset 10f; // 输入框底部与键盘顶部的额外间距 private RectTransform _rectTransform; private Vector2 _originalAnchoredPosition; private float _currentKeyboardHeight 0f; private bool _isKeyboardActive false; void Start() { _rectTransform GetComponentRectTransform(); _originalAnchoredPosition _rectTransform.anchoredPosition; if (targetInputField ! null) { // 为输入框添加事件监听当点击获得焦点时触发适配 targetInputField.onEndEdit.AddListener(OnInputEndEdit); // 注意Unity标准InputField没有直接的onFocus事件我们需要用其他方式模拟 // 一种常见做法是使用EventTrigger组件监听Select事件 } else { Debug.LogError(InputFieldAdapter: Target InputField is not assigned!); } } // 外部调用此方法来触发键盘弹出和适配例如通过一个自定义的点击事件 public void ActivateInputFieldWithAdaptation() { if (targetInputField ! null) { targetInputField.ActivateInputField(); // 激活输入框弹出键盘 StartCoroutine(WaitAndAdaptToKeyboard()); } } private System.Collections.IEnumerator WaitAndAdaptToKeyboard() { // 等待一帧让键盘有足够时间弹出并获取高度 yield return new WaitForEndOfFrame(); AdaptToKeyboard(); } private void AdaptToKeyboard() { #if UNITY_IOS || UNITY_ANDROID _currentKeyboardHeight GetKeyboardHeight(); if (_currentKeyboardHeight 50) // 假设小于50像素不是有效键盘高度 { _isKeyboardActive true; float inputFieldBottom GetInputFieldBottomWorldPosition(); float keyboardTop Screen.height - _currentKeyboardHeight; // 键盘顶部在屏幕空间中的Y坐标 // 将世界坐标转换为当前RectTransform父Canvas下的本地坐标这里简化处理实际情况可能涉及多级Canvas // 更健壮的做法是使用RectTransformUtility进行坐标转换 if (inputFieldBottom keyboardTop) { float offsetY (inputFieldBottom - keyboardTop) additionalOffset; // 使用DOTween进行平滑移动 _rectTransform.DOAnchorPosY(_originalAnchoredPosition.y offsetY, 0.3f).SetEase(Ease.OutBack); } } #endif } private void OnInputEndEdit(string text) { // 当输入结束键盘收起移回原位 RevertPosition(); } public void RevertPosition() { if (_isKeyboardActive) { _rectTransform.DOAnchorPos(_originalAnchoredPosition, 0.25f).SetEase(Ease.InOutQuad); _isKeyboardActive false; _currentKeyboardHeight 0f; } } // 获取输入框底部在世界空间中的Y坐标 private float GetInputFieldBottomWorldPosition() { Vector3[] worldCorners new Vector3[4]; targetInputField.GetComponentRectTransform().GetWorldCorners(worldCorners); // worldCorners[0]是左下角[1]是左上角[2]是右上角[3]是右下角 // 我们关心底部取左下角和右下角Y的最小值因为屏幕坐标系原点在左下角 return Mathf.Min(worldCorners[0].y, worldCorners[3].y); } // 获取键盘高度平台相关 private float GetKeyboardHeight() { // 这里是一个简化示例。真实项目中需要更复杂的平台特定代码。 // 例如在iOS上Keyboard.area.height在键盘显示时可能有效。 // 在Android上通常需要监听View的布局变化来计算。 // 建议使用成熟的插件如 TouchScreenKeyboard 结合原生接口或使用 Unity UI Extensions 中的相关组件。 return TouchScreenKeyboard.area.height * Screen.height; } void OnDestroy() { // 清理DOTween动画防止内存泄漏 _rectTransform.DOKill(); } }实操要点与避坑指南坐标转换是难点上面代码中的GetInputFieldBottomWorldPosition和后续计算是一个简化模型。在复杂的、可能有多个Canvas和不同渲染模式Screen Space - Overlay/Camera/World的项目中世界坐标、屏幕坐标、Canvas本地坐标之间的转换极易出错。你必须清楚你UI的渲染层级并使用RectTransformUtility.ScreenPointToLocalPointInRectangle等API进行精确转换。我建议专门写一个工具方法来处理这个转换。键盘高度的获取TouchScreenKeyboard.area在部分平台和情况下不可靠。对于生产环境强烈建议封装一个原生插件Native Plugin来获取精确的键盘高度。iOS可以用UIKeyboardFrameEndUserInfoKey监听键盘通知Android可以通过getWindowVisibleDisplayFrame计算。这是本方案中最需要投入精力确保稳定的部分。动画性能使用DOTween性能很好但要确保在OnDestroy时调用DOKill()防止对象销毁后动画回调导致的空引用异常。多输入框处理如果界面有多个输入框你需要一个管理器来协调确保同时只有一个适配器在起作用并且在切换输入框时能平滑过渡。3.2 构建跨平台安全区域适配器接下来我们解决异形屏问题。创建一个SafeAreaFitter脚本。using UnityEngine; [ExecuteAlways] // 在编辑模式下也执行方便预览 public class SafeAreaFitter : MonoBehaviour { private RectTransform _rectTransform; private Rect _lastSafeArea new Rect(0, 0, 0, 0); private ScreenOrientation _lastOrientation ScreenOrientation.AutoRotation; void Awake() { _rectTransform GetComponentRectTransform(); if (_rectTransform null) { Debug.LogError(SafeAreaFitter must be on a GameObject with a RectTransform.); return; } // 初始应用一次安全区域 ApplySafeArea(); } void Update() { // 在运行时持续检测安全区域或屏幕方向是否变化 // 对于性能敏感场景可以改为在 OnRectTransformDimensionsChange 消息中处理 if (Application.isPlaying (Screen.safeArea ! _lastSafeArea || Screen.orientation ! _lastOrientation)) { ApplySafeArea(); } } void ApplySafeArea() { Rect safeArea GetSafeArea(); _lastSafeArea safeArea; _lastOrientation Screen.orientation; // 将屏幕空间的安全区域Rect转换为当前RectTransform所在Canvas下的锚点偏移量 // 这里假设Canvas是Screen Space - Overlay模式且RectTransform的锚点已预设为全屏拉伸 Vector2 anchorMin safeArea.position; Vector2 anchorMax safeArea.position safeArea.size; // 从像素坐标归一化为锚点坐标 [0, 1] anchorMin.x / Screen.width; anchorMin.y / Screen.height; anchorMax.x / Screen.width; anchorMax.y / Screen.height; _rectTransform.anchorMin anchorMin; _rectTransform.anchorMax anchorMax; // 重置offset让矩形完全由锚点定义 _rectTransform.offsetMin Vector2.zero; _rectTransform.offsetMax Vector2.zero; } private Rect GetSafeArea() { #if UNITY_IOS // iOS有原生支持 return Screen.safeArea; #elif UNITY_ANDROID // Android需要复杂处理这里返回一个模拟值或调用原生方法 // 实际项目中这里应该调用一个AndroidJavaClass来获取 // 为了演示我们返回整个屏幕区域即不做处理 return new Rect(0, 0, Screen.width, Screen.height); #else return new Rect(0, 0, Screen.width, Screen.height); #endif } #if UNITY_EDITOR // 在编辑器中模拟不同设备的安全区域方便调试 [SerializeField] private bool simulateInEditor false; [SerializeField] private Rect simulatedSafeArea new Rect(0, 34, 1125, 2436 - 34 - 34); // iPhone X 样式 private void OnValidate() { if (simulateInEditor !Application.isPlaying) { UnityEditor.EditorApplication.delayCall () { if (this null) return; _rectTransform GetComponentRectTransform(); if (_rectTransform ! null) { Vector2 anchorMin simulatedSafeArea.position; Vector2 anchorMax simulatedSafeArea.position simulatedSafeArea.size; anchorMin.x / 1125; // 模拟屏幕宽 anchorMin.y / 2436; // 模拟屏幕高 anchorMax.x / 1125; anchorMax.y / 2436; _rectTransform.anchorMin anchorMin; _rectTransform.anchorMax anchorMax; _rectTransform.offsetMin Vector2.zero; _rectTransform.offsetMax Vector2.zero; } }; } } #endif }使用方式在UI层级的最顶层创建一个全屏的Image或空Panel命名为 “SafeAreaPanel”。将其锚点Anchors设置为左下角(0,0)到右上角(1,1)使其铺满整个屏幕。将SafeAreaFitter脚本挂载上去。将所有需要避开刘海和手势条的UI元素如顶部的状态栏、底部的导航栏、输入框区域都作为这个 “SafeAreaPanel” 的子物体。这样无论设备屏幕形状如何“SafeAreaPanel” 都会自动调整自己的大小将其子UI约束在安全区域内。4. 两大核心难题的深度解决方案上面的基础模块搭建好了但在真实项目中你会遇到更棘手的问题。下面分享两个我踩过坑的深度解决方案。4.1 Android平台键盘高度精准获取方案如前所述TouchScreenKeyboard.area在Android上基本是废的。可靠的方法是写Android原生插件。这里提供一个简化思路创建Android Java类在Unity项目的Assets/Plugins/Android目录下创建一个Java文件例如KeyboardHeightProvider.java。这个类需要继承自android.app.Activity或利用android.view.ViewTreeObserver.OnGlobalLayoutListener接口。监听布局变化在onGlobalLayout回调中获取DecorView的getWindowVisibleDisplayFrame可视区域和getRootView的高度。两者的差值再减去可能存在的底部导航栏高度基本就是软键盘的高度。通过JNI回传给Unity将计算出的键盘高度通过UnityPlayer.UnitySendMessage发送回Unity的某个GameObject。在C#中封装在Unity中创建一个管理器类接收来自Java的消息并广播给所有需要键盘高度的组件如我们的InputFieldAdapter。这个过程相当繁琐涉及到Android屏幕度量、沉浸式模式、导航栏类型判断等一系列问题。一个非常实在的建议是在项目初期就评估并引入成熟的第三方插件例如Android Native Keyboard或Mobile Keyboard等Asset Store资源。它们已经处理好了绝大部分平台兼容性问题性价比极高能节省你数天甚至数周的调试时间。4.2 复杂UI层级下的坐标转换与动画冲突当你的输入框嵌套在多层Scroll View、Layout Group或复杂的动画体系中时简单的移动父级RectTransform可能会破坏原有的布局或动画。解决方案使用独立的“浮动层”在Canvas下创建一个专门用于键盘弹出时显示输入框的“浮动层”一个空的RectTransform其渲染顺序Canvas Order设置得比较高。默认状态下这个浮动层是隐藏或位于屏幕之外的。当检测到某个输入框被点击且键盘即将弹出时计算该输入框在当前屏幕中的理想位置键盘上方。将输入框的“内容”可以通过Instantiate原输入框或动态创建一个新的输入组件复制或移动到“浮动层”的对应位置。显示浮动层并隐藏或禁用原位置的输入框避免重复交互。当键盘收起时将输入内容同步回原输入框并隐藏浮动层恢复原UI状态。这种方法将键盘适配逻辑与主UI布局完全解耦避免了复杂的坐标转换和布局冲突特别适合UI结构复杂、有大量动态内容的项目。缺点是实现起来稍复杂需要处理输入框的状态同步。5. 常见问题排查与调试技巧实录即使方案设计得再完美实际调试中依然会状况百出。下面是我总结的“排错清单”问题现象可能原因排查步骤与解决方案键盘弹出时输入框纹丝不动1. 键盘高度获取为0或错误。2. 坐标转换逻辑错误计算出的偏移量为0。3.InputFieldAdapter脚本未被正确触发。1.打印日志在GetKeyboardHeight和GetInputFieldBottomWorldPosition方法中打印输出值确认数据正确。2.检查事件绑定确认ActivateInputFieldWithAdaptation方法被调用如通过按钮事件或EventTrigger。3.简化测试先写死一个键盘高度如300看输入框是否会移动以排除坐标计算问题。输入框移动位置错乱飞屏1. 父级RectTransform的锚点Anchor和轴心点Pivot设置不当。2. 在非Screen Space - Overlay模式下未正确进行坐标空间转换。1.检查RectTransform确保移动的父级对象锚点简单如中心点或底部居中避免使用拉伸锚点。移动时操作anchoredPosition而非localPosition。2.使用正确API如果Canvas是Screen Space - Camera模式必须使用RectTransformUtility.ScreenPointToLocalPointInRectangle将屏幕坐标转换到目标RectTransform的本地空间。在异形屏上安全区域适配不生效1. Android未正确实现GetSafeArea方法。2.SafeAreaFitter所在的GameObject锚点未全屏拉伸。3. 子UI元素超出了安全区域适配器面板。1.编辑器模拟在Unity编辑器中打开simulateInEditor检查蓝色线框是否按预期变化。2.检查层级确保需要适配的UI是SafeAreaFitter脚本所在对象的直接子物体。3.真机调试必须在真机特别是刘海屏安卓机上测试编辑器模拟可能不准。键盘收起后输入框没有移回原位1.OnInputEndEdit事件未触发例如用户直接按Home键退出应用。2. 动画被中断或DOKill被误调用。1.增加兜底监听在OnApplicationPause或OnDestroy中调用RevertPosition。2.监听更多事件可以尝试监听TouchScreenKeyboard的active状态或使用Update轮询检查输入框是否失去焦点。在滚动视图ScrollRect中输入框移动后内容错位移动父级RectTransform改变了其在ScrollRect内容区域中的相对位置导致滚动视图的视口Viewport计算错误。采用“浮动层”方案见4.2节这是解决此问题最彻底的方法。如果必须移动可以尝试在移动后强制刷新ScrollRect的布局LayoutRebuilder.ForceRebuildLayoutImmediate但效果通常不理想。调试技巧使用Debug.DrawLine或自定义OnGUI绘制在OnGUI方法中将计算出的键盘顶部位置、输入框底部位置用线条或矩形画在屏幕上直观地看到你的计算逻辑是否正确。分平台编译测试在Unity编辑器中使用Build Settings中的Development Build和Autoconnect Profiler在真机上实时查看日志和错误信息。设备农场云测试如果条件允许使用Testin、Firebase Test Lab等云真机服务快速在大量不同型号、分辨率的异形屏手机上跑一遍核心交互流程能发现很多意想不到的兼容性问题。移动端的适配工作就是这样充满了细节和边界情况。没有一个放之四海而皆准的银弹方案但通过理解核心原理安全区域、坐标转换、事件驱动并构建起模块化、可调试的代码框架你就能从容应对绝大部分挑战。记住在移动端真机测试的优先级永远高于编辑器模拟。多跑设备多抓日志问题总会现出原形。

相关新闻

哈夫曼编码C++实现:从信息熵到数据压缩的完整工程实践

哈夫曼编码C++实现:从信息熵到数据压缩的完整工程实践

1. 项目概述:为什么哈夫曼树依然值得深挖? 如果你接触过数据压缩,或者上过《数据结构》这门课,大概率听过“哈夫曼树”和“哈夫曼编码”的大名。它听起来像是一个经典的、教科书式的算法,以至于很多人觉得它已经“过时…

2026/10/18 8:09:37 阅读更多 →
短剧出海翻译避坑合集:别人踩过的雷都在这里

短剧出海翻译避坑合集:别人踩过的雷都在这里

短剧出海翻译避坑,最有效的方法不是等项目翻车后补救,而是把别人踩过的雷提前写进合同、制作流程和验收表。高频问题集中在报价、翻译、角色音色、音画同步和背景音乐五处。智马翻译的一站式工作流提供翻译压缩、多模态说话人识别、毫秒级时间轴与导出控…

2026/10/18 5:25:39 阅读更多 →
当今的科学,已然陷入极度回旋的内耗之中

当今的科学,已然陷入极度回旋的内耗之中

一、这种 “回旋式内耗” 体现在四个现实层面 创新路径被锁死:只允许增量改良,拒绝范式重构 当今的科学,已然陷入极度回旋的内耗之中。科学原本的使命,是冲破固有认知,探寻自然界统一的底层规律。但现行学术体系慢慢…

2026/10/18 8:10:01 阅读更多 →

最新新闻

梯度消失全解析:从数学原理到ReLU、BN与残差连接的实战解决路径

梯度消失全解析:从数学原理到ReLU、BN与残差连接的实战解决路径

1. 从一个训练到一半就“躺平”的模型说起如果你亲手训练过一个稍微有点深度的神经网络,大概率见过这种让人抓狂的场景:前几个epoch损失还降得好好的,突然就卡在一个不上不下的数值,准确率死活上不去,再往后训练&#…

2026/10/18 15:01:54 阅读更多 →
LAMMPS (23 Jun 2022) + oneAPI 安装避坑:从环境变量到编译验证的完整清单

LAMMPS (23 Jun 2022) + oneAPI 安装避坑:从环境变量到编译验证的完整清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 15:01:54 阅读更多 →
MATLAB三维热力图绘制全指南:从数据组织到交互验证

MATLAB三维热力图绘制全指南:从数据组织到交互验证

简介:这份资源聚焦MATLAB三维数据可视化,面向需要绘制三维热力图的学生、科研人员与工程技术人员,帮助解决三维曲面数据难以直观呈现的问题。资源包共3个文件,包含1个m脚本、1个mat数据文件和1个png效果图,压缩包约219…

2026/10/18 15:01:54 阅读更多 →
2026 用 AI 工具分析空口包 WiFi 包:TaoToken 统一 Key 接入 tshark/Wireshark 抓包总结

2026 用 AI 工具分析空口包 WiFi 包:TaoToken 统一 Key 接入 tshark/Wireshark 抓包总结

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 15:01:54 阅读更多 →
Java SHA算法实战:选型、编码、文件校验与安全边界

Java SHA算法实战:选型、编码、文件校验与安全边界

说实话,看到“SHA加密算法”这个标题,我第一反应是:这又是一个被写烂的入门Demo。但实际在项目里接手过几个跟数据校验、安全存储相关的模块之后,我觉得“SHA”这一块值得聊的东西其实非常多——很多人止步于会用MessageDigest.ge…

2026/10/18 15:01:54 阅读更多 →
JsLeakWatcher 报出一批对象,真的是内存泄漏吗:页面缓存、监听器和可达路径怎么分

JsLeakWatcher 报出一批对象,真的是内存泄漏吗:页面缓存、监听器和可达路径怎么分

JsLeakWatcher 报出一批对象,真的是内存泄漏吗:页面缓存、监听器和可达路径怎么分 页面退出后 JsLeakWatcher 报出几十个对象,团队立刻把所有缓存清掉,结果二次进入变慢,告警却仍然存在。工具发现“对象仍可达”&…

2026/10/18 15:00:54 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →