v0.2.0 沉浸式 + 按手机重排版 + 去掉导航模块

三条用户反馈一次处理完。

## ① 不够沉浸:首页距顶太远 + 底部白条

根因是**重复避让 + 颜色断裂**,两处都是我自己的错:
· 早先没开全屏时,系统已把窗口推到状态栏下方,我却又加了一个等高的白色
  Column「让出安全区」⇒ 重复避让,实测顶部空出 156px;
· 状态栏底色被设成「页面底色(宣纸米)」,而顶栏是白色 ⇒ 顶部出现
  「米色状态栏 + 白色顶栏」的拼接感,看着就是"没对齐"。

改法:
· EntryAbility 调 setWindowLayoutFullScreen(true),窗口铺满整屏;
· 状态栏底色一律取**顶栏底色**,底部手势条取**页面底色** —— 各自与紧邻元素同色;
· 页面侧用 getWindowAvoidArea 自己让位(顶栏顶部内边距 = 状态栏高度,
  底色一直画到屏幕最上沿);
· 底部那条全宽白 Column 删掉。

避让值走**异步** window.getLastWindow + windowSizeChange 监听
(早先"Ability 取窗存 AppStorage 再同步读"的做法实测读不到值,恒为 0);
旋转/折叠后会自动重算。

验证(像素级,非目测):y=0..200 全为顶栏白(原先 y=0..121 是米色状态条),
底部 y=2224..2444 全为纸色、白条消失。

## ② 去掉「导航」模块

用户原话:「导航是专门为电脑端开发的,都是网站,主要用在浏览器的主页,所以不需要」。
⇒ 删掉 FbNavPage、FbNavLink 类型、FB_DEMO_NAV、fbGroupNav、图标分支与演示数据。
⚠️ 模块清单自此与 Web 端 Module::LIST **有意不等**,注释里写明了别补回去。

## ③ 排版按手机重做(不照搬电脑端)

首页:删掉 hero 招牌整块(它只重复信息面板已有的信息),信息面板升为首块
并改成**无卡片的页面头部**(问候/日期大字、天气右上、三数字贴底)——
套白卡片会在首屏就切出一块白、压缩可用高度,也破坏沉浸感。
卡片从「今天的日程」才开始用,页面层次反而更清楚。

其余按手机重排:观影两列定格(原瀑布流)、任务按状态三段(原多列看板)、
家谱圈层(原折线树)。README 里列了逐项取舍与理由。

## 编译
hvigorw assembleHap --mode module -p product=default --no-daemon
→ BUILD SUCCESSFUL,0 error / 0 warning
This commit is contained in:
2026-10-11 23:20:49 +08:00
parent 41e3aa3d95
commit 0548a45da1
11 changed files with 307 additions and 370 deletions
+19 -21
View File
@@ -2,11 +2,16 @@
* 家书 FamilyBook · 顶栏(鸿蒙端)
*
* 对应 Web 端 `templates/layout.php` 的 `<header class="topbar">`,但按手机习惯调整:
* · 左:抽屉按钮(窄屏)/模块名(宽屏,此时抽屉常驻,不需要按钮)
* · 中:当前模块名 + 一句副标题(Web 端顶栏只放 logo + 导航,端上加副标题更清楚)
* · 右:通知铃铛(带未读角标)+ 头像(点开是账号菜单)
* · 左:抽屉按钮(窄屏)/图标(宽屏,此时抽屉常驻,不需要按钮)
* · 中:当前模块名 + 一句副标题
* · 右:通知铃铛(带未读角标)+ 头像
*
* ⚠️ 顶栏**不放**「设置」—— 与 Web 端一致:设置收在头像菜单里,
* 🔴 沉浸式要点:应用开了 `setWindowLayoutFullScreen(true)`,顶栏**一直画到屏幕最上沿**,
* 状态栏那一段用 `statusBarH` 内边距让出来。这样顶栏的底色与状态栏连成一片,
* 视觉上就是「顶栏顶天」—— 这是"沉浸"的关键,也是之前那个
* 「首页距离上面那么远」的根治办法(那时是重复避让)。
*
* ⚠️ 顶栏**不放**「设置」—— 与 Web 端一致:设置收在抽屉底部的账号区里,
* 顶栏只留日常入口,再把管理入口顶出来会把顶栏挤满。
*/
@@ -18,11 +23,12 @@ import { FbAvatar } from './Widgets';
@ComponentV2
export struct FbTopBar {
@Param app: FbAppState = fbAppState();
/** 状态栏高度(vp)—— 由 Index 量出来传进来,顶栏用它做顶部内边距 */
@Param statusBarH: number = 0;
/** 右侧额外操作(各模块页自己往里塞「新建」「搜索」等按钮) */
@BuilderParam actions: () => void;
build() {
// 顶部安全区由外层容器统一处理(见 Index.ets),这里只占视觉高度
Row({ space: 10 }) {
// ---- 左:窄屏显示抽屉按钮 ----
if (!this.app.wideLayout) {
@@ -36,6 +42,7 @@ export struct FbTopBar {
.width(36)
.height(36)
.backgroundColor(Color.Transparent)
.stateEffect(true)
.onClick(() => {
this.app.drawerOpen = true;
})
@@ -52,13 +59,8 @@ export struct FbTopBar {
.fontSize(17)
.fontWeight(FontWeight.Medium)
.fontColor(FbColors.ink)
if (this.moduleDesc().length > 0) {
Text(this.moduleDesc())
.fontSize(FbMetric.fontTiny)
.fontColor(FbColors.faint)
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
}
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
}
.alignItems(HorizontalAlign.Start)
.layoutWeight(1)
@@ -78,6 +80,7 @@ export struct FbTopBar {
.width(36)
.height(36)
.backgroundColor(Color.Transparent)
.stateEffect(true)
.onClick(() => {
this.app.switchModule('__notifications');
})
@@ -103,20 +106,15 @@ export struct FbTopBar {
.margin({ left: 2 })
}
.width('100%')
.height(FbMetric.topBarH)
.padding({ left: 8, right: 10 })
.alignItems(VerticalAlign.Center)
// 沉浸式:顶部内边距 = 状态栏高度,底色一直画到屏幕最上沿
.padding({ top: this.statusBarH, left: 8, right: 10 })
.height(FbMetric.topBarH + this.statusBarH)
.alignItems(VerticalAlign.Bottom)
.backgroundColor(FbColors.surface)
.border({ width: { bottom: 1 }, color: FbColors.line2 })
}
private moduleName(): string {
const m = fbModuleOf(this.app.activeModule);
return m !== undefined ? m.name : '家书';
}
private moduleDesc(): string {
const m = fbModuleOf(this.app.activeModule);
return m !== undefined ? m.desc : '';
}
}