1. 为什么要在 OpenHarmony 上认真对待 FloatingActionButton
先问一个最实际的问题:你在 OpenHarmony 设备上做 Flutter 应用时,右下角那个圆形的悬浮按钮,是随手丢一个 FloatingActionButton 进去就完事,还是真的把它当作整个页面交互的“心脏”来设计?
从我接触 Flutter for OpenHarmony 这段时间的体会来看,绝大多数开发者对 FAB 的态度是“能用就行”。默认位置、默认颜色、默认图标,跑起来没什么毛病,但用户真正用起来的时候,总觉得差点意思。这个差的意思,其实就是核心操作不够突出、效率不够高——而 FAB 恰恰是解决这个问题的第一选择。
FloatingActionButton 在 Material Design 里的定位非常明确:它是页面上最重要的操作入口,承担的是“用户在这个界面里最该做的那件事”。在 OpenHarmony 这种分布式、多设备形态并存的环境下,FAB 的意义会被进一步放大。因为 OpenHarmony 设备从手机到平板、从电视到车机,屏幕尺寸和交互方式差异很大,一个设计得当的 FAB 能让用户在不同设备上都快速找到核心操作,而不是在一堆普通按钮里翻找。
这篇文章适合谁?正在做 Flutter 应用向 OpenHarmony 迁移的开发者,想在 OpenHarmony 上把交互细节打磨到位的产品经理,以及刚接触 Flutter 跨端开发、对 FAB 使用还停留在默认阶段的初学者。我会把 FAB 从设计思路到具体实现、从常见坑点到性能优化全部拆开讲,尽量给出一套可以直接抄作业的最佳实践。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. FAB 在 OpenHarmony 上的定位:先搞懂“为什么”比“怎么做”更重要
2.1 OpenHarmony 对 Flutter FAB 的支持程度
先说结论:OpenHarmony 对 Flutter 的兼容已经过了“能跑”的阶段,进入“要好用”的阶段。FloatingActionButton 是 Flutter framework 层的标准组件,底层依赖的是 Flutter 自己的渲染引擎,不涉及太多平台原生控件,所以在 OpenHarmony 上使用 FAB 的体验和在其他平台上基本一致。
但这里有一个关键差异:OpenHarmony 的分布式能力和多设备形态决定了 FAB 不能只按手机端的逻辑来设计。你在手机上让 FAB 悬浮在右下角,用户拇指能够轻松触达,这个位置很合理。但同样的逻辑放到电视端或车机端,就完全不适用了——大屏设备的焦点控制逻辑、遥控器操作路径、甚至用户距离屏幕的物理距离,都要求 FAB 的尺寸、位置和交互方式跟着变。
我在实际项目中遇到过一个挺典型的场景:同一个 Flutter 应用同时跑在 OpenHarmony 的手机和开发板上,手机端 FAB 用的是默认的 56 逻辑像素直径,效果很好;但开发板接的是大屏,FAB 还是 56 像素,就显得特别小,遥控器焦点移动到 FAB 上之后,视觉反馈也偏弱。后来我改成根据屏幕宽度动态计算 FAB 尺寸,才解决了这个问题。
2.2 核心操作不等于“唯一操作”
很多人对 FAB 有一个误解:页面上放一个 FAB,就是把某个功能加进去,用户点就行。但 FAB 的正确使用逻辑是——先把页面上所有操作列出来,然后问自己一个问题:用户在这个页面里,80% 的时间进来是为了做什么?
这个问题的答案,才应该是 FAB 承载的操作。
举个例子。一个 OpenHarmony 上的笔记类应用,主页面是笔记列表。页面上可能有这些操作:新建笔记、搜索、排序、同步、设置。如果开发者不加思考地把“新建笔记”放进 FAB,那没问题;但如果“排序”才是用户每次进来都要做的操作,那 FAB 承载“排序”反而更能提升效率。关键在于把 FAB 当作产品决策来对待,而不是当作组件来堆叠。
我自己遵循的一个原则是:一个页面最多放一个 FAB,FAB 只承载一个操作。如果确实有多个高频操作,可以考虑用 FAB 展开菜单(下面会细讲),但默认情况下,宁可让次要操作待在 AppBar 或普通按钮区,也别让 FAB 背上太多包袱。
2.3 从 Material Design 规则看 FAB 的交互约束
FAB 之所以被称为“悬浮”按钮,是因为它永远处于内容之上,不参与页面的滚动流。这个特性既是优势也是约束:因为它常驻,所以不能太突兀;因为它覆盖内容,所以不能挡住关键信息。
Material Design 对 FAB 的直径给出了推荐值:常规 FAB 是 56 像素,迷你 FAB 是 40 像素。在 OpenHarmony 的 Flutter 实现里,这些尺寸是照常生效的,但你得知道一件事:这些数值是按手机端的触摸目标设计的。OpenHarmony 生态里有很多非触摸设备,比如电视、带旋钮的控制面板,这些设备上 56 像素的 FAB 未必好操作。
我建议的调整策略是根据设备的输入方式来决定:纯触摸设备,保持默认尺寸;带遥控器或焦点导航的设备,把 FAB 尺寸适当加大,同时增加焦点高亮的对比度;车机这类强调安全操作的设备,FAB 的位置要避开驾驶员操作困难区域,同时反馈要更明确(比如点击后的水波纹、颜色变化、简短动画)。
3. FAB 在 OpenHarmony 场景下的设计决策清单
3.1 位置:不是只有右下角一个答案
Flutter 的 Scaffold 组件里,FloatingActionButton 默认出现在右下角,这个位置由 floatingActionButtonLocation 参数控制。常见的取值有:
- FloatingActionButtonLocation.endFloat:右下角悬浮(默认)
- FloatingActionButtonLocation.endTop:右上角
- FloatingActionButtonLocation.centerFloat:底部居中
- FloatingActionButtonLocation.startFloat:左下角
- FloatingActionButtonLocation.endContracted:右下角,但会收缩到底部栏附近
在 OpenHarmony 的多设备场景里,我建议不要锁死默认的 endFloat,而是结合页面内容和设备特征来选择。
比如在平板或大屏上,右下角其实并不是最顺手的位置。用户的视线通常先落在屏幕中央偏上的区域,核心操作放在右下角意味着用户需要把视线拉到底部。如果页面主要内容是列表或网格,可以考虑 centerFloat,让 FAB 浮在底部中央,兼顾左右手操作。
如果是车机或带实体按键的设备,FAB 位置还得考虑物理可达性和安全性。这种情况下,我倾向于把 FAB 放在靠近主驾一侧但又不遮挡仪表信息的位置,并且要让 FAB 在获得焦点时有明显的放大或颜色变化反馈。
3.2 尺寸与形状:别让 FAB 变成“隐形按钮”
FAB 的默认形状是圆形,默认尺寸是 56。多数情况下这样没问题,但在 OpenHarmony 大屏或特殊设备上,可能需要单独处理。
我在一个 OpenHarmony 的电视端应用里测试过,默认尺寸的 FAB 在 4K 分辨率下肉眼可见地偏小,焦点移动到上面时视觉反馈也不够强。后来我改成用 MediaQuery 获取屏幕宽度,动态计算 FAB 直径,比如手机端保持 56,平板端拉到 64,电视端放到 72。这样做之后,测试反馈明显变好。
另外,形状上也可以根据品牌调性做调整。Flutter 的 FloatingActionButton 支持通过 shape 参数传入自定义形状,比如圆角矩形、带一点圆角的方形。但要
