一行文本该落在哪里?详解Combo Breaker的findFlowSlots槽位搜索算法
一行文本该落在哪里详解Combo Breaker的findFlowSlots槽位搜索算法【免费下载链接】combo-breakerText layout for Compose to flow text around arbitrary shapes.项目地址: https://gitcode.com/gh_mirrors/co/combo-breakerCombo Breaker是一款为 Jetpack Compose 打造的文字排版库核心能力是让文本自动环绕任意形状矩形、Path 轮廓甚至位图抠出的曲线进行多栏布局。它的灵魂函数findFlowSlots负责回答一个关键问题当前这一行文字到底能放在哪些矩形区域槽位里下面用通俗的方式拆解这套槽位搜索算法带你快速理解文字绕图排版的底层逻辑。一、问题背景为什么需要槽位普通文本控件的假设很简单每一行都是等宽的长方形从左写到右。但一旦页面里插入了图片、徽标或装饰图形一行文字就被切成了0 个、1 个或多个不等宽的碎片。Combo Breaker 的排版流程把这件事拆成两步几何阶段findFlowSlots根据形状算出这一行的所有可用矩形槽位断行阶段逐槽位调用 ICU LineBreaker 计算能塞进多长的文字。理解第一步就理解了整个库 80% 的核心。二、算法输入与输出主入口在 FlowSlots.ktfindFlowSlots(box, container, flowShapes) → ListRectFbox当前这一行文字的区域一个横条矩形container整个栏的外边界多栏排版时与 box 不同flowShapes所有需要绕开的形状列表每个形状带有Path轮廓和FlowType允许文字从哪侧流过返回值按 left 坐标排序的可用槽位矩形列表空列表 这一行完全放不下文字。三、槽位搜索的 4 个核心步骤步骤 1快速排除无关形状对每个形状先用 quickReject 做 O(1) 检查形状整体在行的上方/下方、或FlowType.None完全不参与排版直接跳过。绝大多数行只需要处理 1~2 个形状这一步省掉大量无用功。步骤 2区间树查找与当前行相交的线段任意Path轮廓在创建 FlowShape 时就被预先处理好了Path.toIntervals() 把曲线展平成一条直线段序列容差 1px每条线段按纵向范围y0~y1插入一棵红黑区间树。于是哪些线段穿过当前这一行变成一次高效的区间重叠查询flowShape.intervals.findOverlaps(行区间, intervals)这正是算法的搜索所在——用空间索引代替逐点扫描复杂轮廓也能保持每行 O(log n) 级别的查找开销。步骤 3裁剪并求出形状的左右极值命中的线段用 clipSegmentLiang-Barsky 裁剪约束到行内后取所有端点的 x 最小/最大值shapeMin 本行内形状最左位置shapeMax 本行内形状最右位置。这两个数就是槽位的天然分界线box.left ~ shapeMin是左侧安全区shapeMax ~ box.right是右侧安全区。步骤 4生成槽位并做交集收缩核心在 addReducedSlots它按形状的FlowType决定左侧、右侧还是双侧生成候选槽位并与已有槽位做水平交集。源码注释里的示意图非常形象XX ________ 右侧流动形状 → 生成左侧槽位 XX | | XX ---------- 加上左侧流动形状后两个槽位被交集收窄 XX __________ ____ XX | | XXX | | XXX XX -------- XXX ---- XXX直觉上每加入一个形状就是往现有空白上打一个洞剩下的连通矩形就是槽位。若某候选槽位不与任何已有槽位重叠则直接新增。四、排除区规则FlowType 如何限制文字流向槽位生成后还要执行 applyFlowShapeExclusions这是文字该绕哪边的执法环节FlowType行为OutsideLeft所有槽位的右边界收缩到hit.min右侧区域禁止放字OutsideRight所有槽位的左边界推后到hit.max左侧区域禁止放字Outside双侧放行槽位落在形状范围内则直接清空FlowType 枚举 还定义了OutsideStart/OutsideEnd随 LTR/RTL 方向自动解析和None。排除区是全局生效的——即使别的形状允许在某个区域放字一个OutsideLeft形状也能把那里变成禁区。如果所有形状都被排除、没有任何线段命中算法退化为最安全的行为整行 box 本身就是一个槽位。五、从槽位到成行结果如何驱动文字排版回到调用方 TextLayout.kt每渲染一行就取y ~ y lineHeight的横条去查槽位然后按 left 从小到大遍历用槽位宽度作为 LineBreaker 的约束宽度重新计算断行若某槽位太窄放不下一行跳过它下一行可能又能利用把文字段画进槽位继续下一个槽位直到整行排满。所以一行文字可以被拆成左窄条 右侧长段这样多段渲染——这就是多栏绕图效果的全部秘密。六、性能设计亮点零分配复用注意findFlowSlots的最后一个参数 FlowSlotFinderState槽位列表、区间列表、临时点全部预分配跨行调用只做clear()复用。因为该函数每行都会被调用一次避免 GC 压力对流畅滚动的长列表至关重要。七、相关文件导航文件职责FlowSlots.kt槽位搜索主算法与排除区IntervalTree.kt红黑区间树线段快速检索FlowShape.kt形状 区间树 包围盒封装Geometry.ktPath 展平为线段并建树Clipping.kt线段裁剪BasicTextFlow.ktFlowType 定义与多栏槽位汇总TextLayout.kt逐行调用 findFlowSlots 完成排版八、一句话总结findFlowSlots的本质是用区间树把曲线轮廓 × 文本行的相交问题降维成左右两个 x 极值再用矩形交集不断在空白上打孔最终交出一排可供断行器使用的安全槽位。理解了打孔求交集这个几何直觉你就掌握了 Combo Breaker 文字环绕布局的核心算法。【免费下载链接】combo-breakerText layout for Compose to flow text around arbitrary shapes.项目地址: https://gitcode.com/gh_mirrors/co/combo-breaker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

playground-elements 如何实现浏览器内 TypeScript 编译:Web Worker 多线程与类型自动获取实战

playground-elements 如何实现浏览器内 TypeScript 编译:Web Worker 多线程与类型自动获取实战

playground-elements 如何实现浏览器内 TypeScript 编译:Web Worker 多线程与类型自动获取实战 【免费下载链接】playground-elements Serverless coding environments for the web. 项目地址: https://gitcode.com/gh_mirrors/pl/playground-elements playg…

2026/8/26 11:20:31 阅读更多 →
toxic-repos快速上手教程:5步从零搭建你的开源仓库安全黑名单

toxic-repos快速上手教程:5步从零搭建你的开源仓库安全黑名单

toxic-repos快速上手教程:5步从零搭建你的开源仓库安全黑名单 【免费下载链接】toxic-repos We are against discrediting open source software 项目地址: https://gitcode.com/gh_mirrors/to/toxic-repos toxic-repos 是一个社区维护的开源仓库安全黑名单项…

2026/8/25 8:24:43 阅读更多 →
监听每一次开关访问:feature-flags的4个事件如何助力你的审计与监控

监听每一次开关访问:feature-flags的4个事件如何助力你的审计与监控

监听每一次开关访问:feature-flags的4个事件如何助力你的审计与监控 【免费下载链接】feature-flags A Laravel package for handling feature flags 项目地址: https://gitcode.com/gh_mirrors/fe/feature-flags 如果你在用 Laravel 管理功能开关&#xff0…

2026/8/26 11:20:29 阅读更多 →

最新新闻

旋转体特征建模全解析:从草图三要素到参数化与 API 自动化

旋转体特征建模全解析:从草图三要素到参数化与 API 自动化

这次我们直接进入主题:在三维 CAD 建模中,旋转体特征(Revolved Feature)是使用频率最高的一类命令。它解决的核心问题是:把一类轴类、盘类、法兰、壳体、瓶体等回转体零件,用“一条中心线 一个封闭截面”快…

2026/8/26 11:20:59 阅读更多 →
S32DS导入LDF文件错误排查:从语法解析到工程配置的完整指南

S32DS导入LDF文件错误排查:从语法解析到工程配置的完整指南

1. 项目概述:当LDF文件在S32DS中“闹脾气”时 在嵌入式开发,特别是汽车电子领域使用恩智浦(NXP)的S32 Design Studio(S32DS)时,处理LIN总线配置是家常便饭。LIN描述文件(LDF&#xf…

2026/8/26 11:20:59 阅读更多 →
MX25L128/MX25L256 SPI NOR Flash驱动移植与调试实战指南

MX25L128/MX25L256 SPI NOR Flash驱动移植与调试实战指南

简介:嵌入式系统中,SPI NOR Flash凭借接口简单、存储可靠等特性,被广泛应用于固件存储、日志记录与OTA升级等场景。其工作原理是通过SPI总线发送指令、地址和数据,完成读、写、擦除操作。掌握驱动移植方法,理解页编程的…

2026/8/26 11:20:59 阅读更多 →
Maya建模零基础入门:卡通微缩行李箱完整制作流程

Maya建模零基础入门:卡通微缩行李箱完整制作流程

你的 Maya 建模入门第一课,不需要从复杂的角色或机械硬表面开始。这次我们直接做一个卡通微缩行李箱场景,把 Maya 建模中最常用的多边形建模、倒角、对称编辑、材质赋予和基础渲染完整串一遍。这个案例的特点是结构简单、零件数量适中、视觉反馈强&#…

2026/8/26 11:20:59 阅读更多 →
桌面自动化实战:从定时任务到图像识别,彻底解放重复劳动

桌面自动化实战:从定时任务到图像识别,彻底解放重复劳动

1. 项目概述:从手动到自动的桌面革命如果你每天上班第一件事,就是打开一堆固定的软件,登录几个账号,然后重复点击、输入、切换窗口;或者你需要在凌晨三点准时运行一个数据备份脚本,但总被闹钟吵醒又睡过头—…

2026/8/26 11:20:59 阅读更多 →
深入解析ext4文件系统数据恢复:原理、策略与实战工具指南

深入解析ext4文件系统数据恢复:原理、策略与实战工具指南

1. 从一次深夜误删说起:为什么ext4数据恢复如此特殊 凌晨三点,服务器告警邮件把我从睡梦中拽醒。登录系统一看,一个刚入职不久的同事在执行批量清理脚本时,误将 /var/log/ 目录下的所有 .log 文件用 rm -rf 给清空了。这本身…

2026/8/26 11:19:57 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →