Android SeekBar深度定制:从原理到实践,实现高度与样式精准控制
1. 从“能用”到“好用”SeekBar的深度实践与高度定制在Android应用开发里处理用户交互式进度调节的场景SeekBar几乎是绕不开的组件。无论是音乐播放器的音量滑块、视频播放的进度拖拽还是图片编辑器的参数微调你都能看到它的身影。表面上看SeekBar就是一个带滑块的进度条android:progress属性一设监听器一加功能就实现了。但真到了UI需要高度定制尤其是产品经理拿着设计稿指着那个“又细又精致”的进度条问你“这个高度和样式能实现吗”的时候很多开发者才会意识到事情没那么简单。默认的SeekBar样式往往粗犷且与设计语言格格不入而直接调整layout_height属性你可能发现滑块Thumb的位置诡异、触摸区域错位进度条ProgressDrawable的绘制也不对劲。这背后涉及的是Android视图测量Measure、布局Layout、绘制Draw的完整流程以及SeekBar对进度条和滑块样式的特殊管理机制。今天我们就来彻底拆解SeekBar不仅让你知道怎么“设置高度”更让你明白为什么这么设置以及如何优雅地实现任何自定义设计。2. SeekBar核心架构与样式系统解析要解决高度设置问题必须先理解SeekBar的构成。SeekBar继承自AbsSeekBar而AbsSeekBar又继承自ProgressBar。因此SeekBar的本质是一个特殊的进度条它增加了可拖动的滑块Thumb和对应的触摸交互逻辑。其视觉上主要由三个核心部分构成背景轨道Track进度条的底层背景通常是一个长条形的Drawable。进度条Progress覆盖在背景轨道上表示当前进度的部分也是一个Drawable。在SeekBar中背景轨道和进度条通常被合并定义在一个LayerDrawable中也就是我们常通过android:progressDrawable属性设置的。滑块Thumb用户可拖动的圆形或任意形状指示器通过android:thumb属性设置。系统默认会为这三个部分提供一套样式。当你直接在布局文件中设置android:layout_height为一个较大值时SeekBar的整体高度确实会增加但进度条ProgressDrawable和滑块Thumb的绘制很可能不会按你预期的方式适配这个新高度从而导致视觉错乱。2.1 为什么直接设置layout_height会出问题这源于SeekBar更准确地说是其父类ProgressBar对progressDrawable的默认处理逻辑。系统默认的进度条Drawable例如android:drawable/progress_horizontal自身有固定的内在高度Intrinsic Height。当SeekBar的测量高度大于这个内在高度时默认的绘制行为可能不会将其拉伸Stretch以填满整个SeekBar视图区域而是可能居中或从顶部开始绘制导致进度条看起来还是原来的粗细只是周围多了空白。更棘手的是滑块Thumb的垂直居中计算。滑块的默认垂直位置通常是基于进度条Drawable的绘制区域来计算的而非整个SeekBar视图的高度。当进度条没有正确拉伸时滑块的垂直位置就会偏离你的预期。2.2 SeekBar样式定制的正确入口LayerDrawable与NinePatchAndroid为这类可缩放控件样式推荐使用NinePatch图片.9.png或XML定义的ShapeDrawable、LayerDrawable。对于SeekBar我们通常需要自定义一个progressDrawable它是一个layer-list里面至少包含两个item一个代表背景android:idandroid:id/background一个代表进度android:idandroid:id/progress。关键在于要使进度条的高度随SeekBar变化你必须确保这个progressDrawable中的Drawable本身是可拉伸的。对于图片使用NinePatch并定义好可拉伸区域是最佳实践。对于纯色或简单形状使用shape标签并在其中定义size或依赖父容器缩放属性则更为灵活。3. 实战一步步实现精确高度与样式的SeekBar理解了原理我们进入实战环节。假设设计稿要求一个高度为4dp的细进度条滑块直径为24dp进度条颜色为蓝色背景为浅灰色。3.1 第一步创建自定义进度条Drawable我们完全使用XML来定义这样无需切图且适配性最好。在res/drawable目录下创建seekbar_custom_track.xml。?xml version1.0 encodingutf-8? layer-list xmlns:androidhttp://schemas.android.com/apk/res/android !-- 背景轨道 (id必须是background) -- item android:idandroid:id/background shape corners android:radius2dp / !-- 圆角半径通常为高度的一半 -- solid android:color#E0E0E0 / !-- 浅灰色背景 -- size android:height4dp / !-- 核心固定高度为4dp -- /shape /item !-- 二级进度如果有需要例如缓冲进度 -- !-- item android:idandroid:id/secondaryProgress ... /item -- !-- 前景进度条 (id必须是progress) -- item android:idandroid:id/progress clip shape corners android:radius2dp / solid android:color#2196F3 / !-- 蓝色进度 -- size android:height4dp / !-- 高度必须与背景一致 -- /shape /clip /item /layer-list关键点解析size android:height4dp这是控制进度条视觉高度的核心。它直接定义了ShapeDrawable的固有高度。无论SeekBar的layout_height设为多少这个Shape都将以4dp的高度进行绘制。clip标签包裹progress的shape。这是必须的因为AbsSeekBar会使用这个ClipDrawable来根据当前进度值裁剪进度条的显示范围。没有clip进度条将不会随滑块移动而增长/缩短。corners设置圆角让进度条两端呈现圆形。半径通常设置为高度4dp的一半即2dp这样两端就是完美的半圆形。3.2 第二步创建自定义滑块ThumbDrawable在res/drawable目录下创建seekbar_custom_thumb.xml。?xml version1.0 encodingutf-8? shape xmlns:androidhttp://schemas.android.com/apk/res/android android:shapeoval !-- 圆形滑块 -- solid android:color#2196F3 / !-- 与进度条同色 -- stroke android:width2dp android:color#FFFFFF / !-- 白色描边增加辨识度 -- size android:width24dp android:height24dp / !-- 固定尺寸为24dp -- /shape也可以使用一个Selector来实现按下状态的效果?xml version1.0 encodingutf-8? selector xmlns:androidhttp://schemas.android.com/apk/res/android item android:state_pressedtrue shape android:shapeoval solid android:color#1976D2 / !-- 按下时深蓝色 -- stroke android:width2dp android:color#FFFFFF/ size android:width28dp android:height28dp/ !-- 按下时可稍大 -- /shape /item item shape android:shapeoval solid android:color#2196F3 / stroke android:width2dp android:color#FFFFFF/ size android:width24dp android:height24dp/ /shape /item /selector3.3 第三步在布局文件中应用自定义样式现在在布局XML中使用这些自定义Drawable。SeekBar android:idid/seekBar android:layout_widthmatch_parent android:layout_heightwrap_content !-- 或一个足够大的值如48dp -- android:max100 android:progress50 android:progressDrawabledrawable/seekbar_custom_track android:thumbdrawable/seekbar_custom_thumb android:minHeight24dp !-- 重要确保触摸区域高度不小于滑块直径 -- android:maxHeight24dp android:paddingStart12dp !-- 重要为滑块留出边距防止滑块溢出视图边界 -- android:paddingEnd12dp/参数与属性深度解读android:layout_heightwrap_content这是最推荐的做法。SeekBar会根据其内容主要是progressDrawable和thumb所需的高度加上minHeight/maxHeight以及padding的约束来自动计算自身高度。系统会取thumb的高度、progressDrawable的高度以及minHeight三者中的最大值。android:minHeight与android:maxHeight这两个属性是控制SeekBar触摸区域高度的关键。即使你的进度条只有4dp高但滑块有24dp用户很难精准点到4dp高的细条。将minHeight和maxHeight设置为不小于滑块直径的值如24dp可以确保整个SeekBar视图的触摸响应区域足够大提升用户体验。minHeight和maxHeight设置相同值可以固定触摸区域高度。android:paddingStart与android:paddingEnd这是极易忽略但至关重要的设置滑块Drawable是有宽度的24dp。如果不设置内边距当滑块拖到最左或最右端时滑块的边缘会超出进度条的起点和终点甚至可能被父布局裁剪。通常左右内边距应设置为滑块半径即thumb宽度 / 2。这样能保证滑块的圆心与进度条的起点和终点对齐视觉和交互都最准确。android:splitTrack这个属性默认为true意味着进度条会在滑块下方被“分开”绘制。如果你自定义的进度条样式在滑块处有特殊效果可以设置为false。在我们的场景中通常保持默认即可。3.4 第四步在代码中设置监听与逻辑样式搞定后功能逻辑就很简单了。// Kotlin 示例 binding.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { // 进度变化时回调fromUser表示是否由用户拖动触发 if (fromUser) { Log.d(SeekBar, 用户拖动至: $progress) // 更新UI如显示当前进度百分比 binding.tvProgress.text $progress% } } override fun onStartTrackingTouch(seekBar: SeekBar) { // 用户开始触摸滑块时调用 Log.d(SeekBar, 开始拖动) // 可以在这里做一些视觉反馈如放大滑块 } override fun onStopTrackingTouch(seekBar: SeekBar) { // 用户停止触摸滑块时调用 Log.d(SeekBar, 停止拖动最终值: ${seekBar.progress}) // 可以在这里提交最终值如调整音量、保存设置等 applyVolume(seekBar.progress) } }) // 动态设置进度例如来自网络加载 binding.seekBar.progress calculatedProgress // 获取SeekBar当前进度 val currentProgress binding.seekBar.progress4. 高级技巧与疑难杂症排查即使按照上述步骤操作你可能还是会遇到一些奇怪的问题。下面是我在实际项目中踩过坑后总结的经验。4.1 进度条高度“不听话”的几种情况与解决方案问题1设置了自定义progressDrawable但高度看起来还是比4dp粗。排查检查自定义的Drawable XML中是否在shape里明确使用了size android:height4dp。如果没用sizeShapeDrawable可能会尝试拉伸填充。排查检查是否在代码中或通过主题Theme又设置了其他的进度条样式覆盖了你的自定义样式。技巧给你的进度条Shape加一个临时性的stroke边框看看它的实际绘制边界到底在哪这是一个非常有效的调试手段。问题2滑块Thumb没有垂直居中偏上或偏下。原因这通常是因为SeekBar的layout_height、minHeight、progressDrawable的实际绘制高度以及thumb的高度这几者之间的关系不协调。滑块垂直居中的基准线可能是progressDrawable的绘制区域。解决方案确保你的progressDrawable背景和进度在视觉上是垂直居中的。一个更稳健的方法是将SeekBar的layout_height设为wrap_content并设置一个明确的minHeight比如等于滑块高度。然后确保你的自定义progressDrawable中的shape不设置size的height或者将其height设置为match_parent但XML中不支持而是通过SeekBar的layout_height来控制。实际上更常见的做法是接受进度条在垂直方向上的位置通过调整progressDrawable中shape的padding或使用inset包裹来微调其在轨道内的垂直位置。!-- 微调进度条在轨道内的垂直位置示例 -- item android:idandroid:id/progress clip inset android:insetTop2dp android:insetBottom2dp shape corners android:radius1dp/ solid android:color#2196F3/ /shape /inset /clip /item这样进度条会在轨道内上下各留出2dp的空白相当于实现了垂直方向的对齐调整。4.2 触摸灵敏度与滑块“跳动”问题问题用户拖动时滑块会“跳”到触摸点而不是从滑块当前位置开始平滑跟随。原因这是SeekBar的默认行为android:thumbOffset为0且默认触摸模式。当你触摸滑块轨道ThumbTrack的任意位置时SeekBar会尝试将进度立即设置到该点。解决方案如果你希望只有触摸并拖动滑块本身时才改变进度而点击轨道是跳转到该位置这是默认且合理的行为。若想改变可能需要继承SeekBar重写onTouchEvent但这会破坏标准交互需谨慎。通常我们接受这个默认行为因为它符合大多数用户对进度条控件的预期。4.3 在RecyclerView或列表中使用SeekBar的注意事项在可滚动的列表中每个Item持有一个SeekBar时需要特别注意视图复用带来的状态错乱问题。坑点当用户拖动某个Item中的SeekBar后滑动列表被复用的另一个Item中的SeekBar可能自动显示了之前设置的进度值。解决方案在onBindViewHolder中必须为SeekBar重新设置进度值并且最好在设置值之前先移除旧的监听器防止错误回调设置完值后再添加新的监听器。override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item dataList[position] // 先移除旧的监听器避免错乱 holder.seekBar.setOnSeekBarChangeListener(null) // 设置进度值 holder.seekBar.progress item.currentProgress // 设置新的监听器 holder.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { // ... 监听器实现记得更新数据源item.currentProgress }) // 其他UI绑定... }4.4 性能考量避免在onProgressChanged中执行重操作onProgressChanged回调的频率非常高用户快速拖动时可能每毫秒触发多次。重要提示绝对不要在onProgressChanged中执行网络请求、复杂的数据库操作、频繁的视图布局更新如修改其他View的LayoutParams等重量级操作。这会导致UI卡顿拖动不跟手。正确做法对于实时性要求高的反馈如更新一个TextView显示当前数值这是可以的。对于需要提交的最终操作如调整音量、保存设置应该在onStopTrackingTouch中执行。如果需要在拖动过程中进行一些计算可以考虑使用debounce或throttle操作符借助RxJava或Kotlin Flow来降低回调频率。5. 超越基础仿主流应用SeekBar样式实战让我们挑战一个更复杂的设计仿造某音乐App的播放进度条它具有以下特征极细的灰色背景轨道播放进度为蓝色缓冲进度为浅蓝色且三种进度条高度各不相同缓冲进度最粗播放进度次之背景最细滑块是一个带有阴影的圆形。这个需求的关键在于自定义一个更复杂的progressDrawable它需要包含三个图层背景、二级进度缓冲、主进度。seekbar_music_style.xml:layer-list xmlns:androidhttp://schemas.android.com/apk/res/android !-- 背景轨道 (最细) -- item android:idandroid:id/background shape solid android:color#333333 / size android:height2dp / !-- 高度2dp -- corners android:radius1dp / /shape /item !-- 缓冲进度 (最粗) -- item android:idandroid:id/secondaryProgress clip shape solid android:color#6699CC / !-- 浅蓝色 -- size android:height4dp / !-- 高度4dp -- corners android:radius2dp / /shape /clip /item !-- 播放进度 (中等) -- item android:idandroid:id/progress clip shape solid android:color#2196F3 / !-- 蓝色 -- size android:height3dp / !-- 高度3dp -- corners android:radius1.5dp / /shape /clip /item /layer-list布局中使用SeekBar android:layout_widthmatch_parent android:layout_heightwrap_content android:maxHeight48dp android:minHeight48dp android:paddingStart24dp android:paddingEnd24dp android:progressDrawabledrawable/seekbar_music_style android:thumbdrawable/thumb_with_shadow !-- 一个带阴影的圆形图片或XML -- android:splitTrackfalse/ !-- 这里设为false让进度条在滑块下不被“切开”视觉效果更连贯 --实现要点图层顺序layer-list中的item是叠放的后定义的在上层。所以顺序是背景在下然后是二级进度最后是主进度。这样主进度才能覆盖在二级进度之上。高度差异通过为每个shape设置不同的size android:height来实现。为了让不同高度的进度条视觉上居中你可能需要像前面提到的使用inset或通过精确计算corners的半径和size的高度来手动调整。splitTrack属性在这个设计中我们可能希望滑块下方的进度条是连续的所以将android:splitTrack设置为false。滑块阴影thumb_with_shadow可以是一个带阴影的PNG图片也可以使用LayerDrawable或支持elevation的View但SeekBar的thumb是Drawable不支持elevation。更高级的做法是自定义SeekBar在onDraw方法中为滑块绘制阴影。经过这样一番从原理到实战从基础到进阶的梳理相信你再面对任何SeekBar的定制需求都能游刃有余。核心记住三点一是理解其由progressDrawable和thumb构成的样式系统二是通过size、padding和minHeight协同控制尺寸与触摸区域三是在复杂交互场景如列表中妥善处理状态与监听器。把这些搞透进度条就不再是那个“熟悉的陌生人”而会成为你手中实现精致交互的利器。

相关新闻

STM32开发环境搭建:从零配置VSCode+GCC+OpenOCD+STM32CubeMX

STM32开发环境搭建:从零配置VSCode+GCC+OpenOCD+STM32CubeMX

1. 项目概述:为什么STM32环境配置是第一个“大坑”刚接触STM32的朋友,十有八九会卡在开发环境配置这一步。这感觉就像拿到一把精密的瑞士军刀,却发现没有开刃的工具,空有想法却无从下手。我见过太多人,兴致勃勃地买了第…

2026/10/17 4:13:45 阅读更多 →
通义千问Qwen模型本地部署实战:从LM Studio到LoRA微调全指南

通义千问Qwen模型本地部署实战:从LM Studio到LoRA微调全指南

通义千问(Qwen)系列模型在开源大模型领域一直保持着高频更新和强大的竞争力。今天,我们聚焦于其最新动态: Qwen Live 的正式上线以及即将到来的 EP2 直播 。这不仅仅是一个简单的直播预告,更标志着通义千问在模型部…

2026/10/17 4:15:29 阅读更多 →
TelcoAgent-Bench:电信多语言AI智能体基准测试框架解析与实践

TelcoAgent-Bench:电信多语言AI智能体基准测试框架解析与实践

1. 项目概述:为什么电信行业需要一个多语言AI智能体基准? 如果你在电信行业或者AI应用开发领域待过一段时间,肯定会发现一个现象:关于“AI智能体”的讨论热火朝天,各种模型和框架层出不穷,但当你真的想把一…

2026/10/17 4:18:38 阅读更多 →

最新新闻

中级开发者AI能力升级路线图:从工程化到RAG与微调

中级开发者AI能力升级路线图:从工程化到RAG与微调

1. 先别急着学新框架,重新给自己画一张能力坐标 这几年我面试过不少中级开发者,也带过一些从普通业务开发转向AI方向的团队同事。一个很明显的现象是:很多人并不是不努力,而是努力的方向太散了。今天刷到一篇讲大模型微调的文章&a…

2026/10/17 11:58:36 阅读更多 →
2026年转行网络安全还来得及吗?真实行情与务实入行路径全拆解

2026年转行网络安全还来得及吗?真实行情与务实入行路径全拆解

经常有人私信我:2026年了,现在转行网络安全到底还来不来得及?这个问题几乎每一年都有人问,但随着时间推进,答案其实一直在变。作为在这个行当里做了多年、一路踩过不少坑的人,我想把这几年观察到的行情、带…

2026/10/17 11:58:36 阅读更多 →
Flink背压排查实战:从Kafka Lag积压到状态后端优化的完整复盘

Flink背压排查实战:从Kafka Lag积压到状态后端优化的完整复盘

下午三点多,群里突然刷出一条告警:某个实时链路Kafka Lag超过500万,还在继续涨。我当时第一反应是任务挂了或者下游挂了,打开Flink UI一看,任务状态RUNNING,Checkpoint也正常,但处理延迟已经从平…

2026/10/17 11:58:36 阅读更多 →
AI PR门禁:大模型驱动的代码审查与GitHub Actions自动化实践

AI PR门禁:大模型驱动的代码审查与GitHub Actions自动化实践

1. 先拆清楚:AI PR 门禁到底在门禁什么很多同学第一次听到“AI PR 门禁”这个词,第一反应是:是不是机器人来审核代码?其实不是那么玄乎。它做的事情,本质上是把原来靠人肉 review 才能完成的那一部分“低水平重复劳动”…

2026/10/17 11:58:36 阅读更多 →
码尚云标签3.0模板共享:从文件管理到团队协作标准化

码尚云标签3.0模板共享:从文件管理到团队协作标准化

上周有个同行问我:你们部门几十号人,天天和标签打交道,是怎么保证所有人打印出来的标签长得一模一样的?我说,靠的不是一遍遍发通知、也不是靠老师傅口头叮嘱,而是把标签模板这件事从“个人电脑里的一个文件…

2026/10/17 11:58:36 阅读更多 →
HTML网页结构搭建:从语义化标签到整站规划实践

HTML网页结构搭建:从语义化标签到整站规划实践

很多刚入门前端的朋友,在拿到一个设计稿之后的第一反应往往是:开始写div,一层套一层,哪里不对就再加一个div。等页面勉强显示出来,自己再看都觉得头疼,更别提后续要加功能、调样式、改文案时会多么痛苦。我…

2026/10/17 11:57:36 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →