页面预览

前言

萌宠日记首页 中,我们采用了 Scroll 嵌套 Column 的经典布局模式,实现了 可滚动的垂直布局。这种模式是 ArkUI 中最常用的 长页面布局方案,它能在有限屏幕空间内展示大量内容,同时保持流畅的滚动体验。

本文将从 萌宠日记 的 HomePage 布局出发,深入解析 Scroll 与 Column 的配合使用、布局参数配置、滚动性能优化,以及如何构建一个完整的可滚动首页。

一、布局架构总览

1.1 首页整体布局

┌─────────────────────────────────────┐
│  Scroll (可滚动容器)                  │
│  ┌─────────────────────────────────┐ │
│  │  Column (垂直布局,space: 16)    │ │
│  │  ┌───────────────────────────┐  │ │
│  │  │  Header (标题栏)          │  │ │
│  │  ├───────────────────────────┤  │ │
│  │  │  宠物信息卡片              │  │ │
│  │  ├───────────────────────────┤  │ │
│  │  │  快捷操作图标              │  │ │
│  │  ├───────────────────────────┤  │ │
│  │  │  今日记录卡片              │  │ │
│  │  ├───────────────────────────┤  │ │
│  │  │  健康提醒列表              │  │ │
│  │  └───────────────────────────┘  │ │
│  └─────────────────────────────────┘ │
└─────────────────────────────────────┘

1.2 核心代码

// HomePage.ets — 首页布局结构
@Entry
@Component
export struct HomePage {
  build() {
    Scroll() {
      Column({ space: 16 }) {
        // 1. 标题栏
        HeaderRow()

        // 2. 宠物信息卡片
        PetProfileCard()

        // 3. 快捷操作按钮
        QuickActionRow()

        // 4. 今日记录
        TodayRecordSection()

        // 5. 健康提醒
        HealthReminderSection()
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFF8F0')
    .scrollBar(BarState.Off)  // 隐藏滚动条
  }
}

提示Scroll 组件内部只能有一个根组件,因此使用 Column 作为唯一的子组件,将多个内容区块垂直排列。这是 ArkUI 中构建可滚动页面的标准模式。

二、Scroll 组件详解

2.1 Scroll 核心属性

Scroll() {
  // 内容...
}
.width('100%')                      // 撑满屏幕宽度
.height('100%')                     // 撑满屏幕高度
.scrollBar(BarState.Off)            // 隐藏滚动条
.scrollable(ScrollDirection.Vertical) // 垂直滚动(默认)
.edgeEffect(EdgeEffect.Spring)       // 边缘回弹效果
.onDidScroll((x: number, y: number) => {
  console.log(`Scrolled to: ${y}`)   // 滚动事件监听
})

2.2 Scroll 属性对照表

属性类型默认值萌宠日记配置说明
scrollBarBarStateBarState.AutoBarState.Off隐藏滚动条,界面更简洁
scrollableScrollDirectionVertical未配置默认垂直滚动
edgeEffectEdgeEffectEdgeEffect.Spring未配置边缘回弹效果
onDidScroll回调未配置可监听滚动位置
enableScrollInteractionbooleantrue未配置启用滚动交互

三、Column 布局详解

3.1 Column 属性

Column({ space: 16 }) {  // 子组件间距 16vp
  // 内容区块...
}
.width('100%')
.padding({ left: 16, right: 16 })

3.2 Column 属性对照表

属性类型萌宠日记配置说明
spacenumber16子组件间垂直间距
alignItemsHorizontalAlign默认 HorizontalAlign.Center水平对齐方式
justifyContentFlexAlign默认 FlexAlign.Start垂直对齐方式
widthLength'100%'宽度撑满
paddingPadding各区块独立设置内边距

3.3 间距控制

Column 的 space 参数控制各个子组件之间的间距:

space: 16
    ↓
HeaderRow            ← 顶部:16px padding
    space 16
PetProfileCard       ← 左右:16px margin
    space 16
QuickActionRow       ← 底部:16px padding
    space 16
TodayRecordSection
    space 16
HealthReminderSection
    space 16  (bottom: 16)

四、内容区块划分

4.1 区块拆分

首页的 5 个内容区块,每个区块独立封装:

// 区块 1: 标题栏
@Builder
HeaderRow() {
  Row() {
    Text('☰').fontSize(24).fontColor('#333333')
    Blank()
    Text('萌宠日记').fontSize(20).fontWeight(FontWeight.Bold)
    Blank()
    Text('').fontSize(22)  // 占位,保持对称
  }
  .width('100%')
  .padding({ left: 16, right: 16, top: 8, bottom: 8 })
}

// 区块 2: 宠物信息卡片
@Builder
PetProfileCard() {
  Column() {
    // 宠物信息内容...
  }
  .width('100%')
  .backgroundColor('#FFFFFF')
  .borderRadius(16)
  .margin({ left: 16, right: 16 })
  .shadow({ radius: 4, color: '#10000000', offsetY: 2 })
}

4.2 区块拆分优势

优势说明
可读性每个区块逻辑清晰,易于理解
可维护性修改单个区块不影响其他区块
可复用性区块可以在其他页面复用
测试性每个区块可独立测试

五、滚动方向与滚动条

5.1 滚动方向

// 垂直滚动(默认)
Scroll() {
  // 内容...
}
.scrollable(ScrollDirection.Vertical)

// 水平滚动
Scroll() {
  // 内容...
}
.scrollable(ScrollDirection.Horizontal)

// 双向滚动
Scroll() {
  // 内容...
}
.scrollable(ScrollDirection.Both)

// 禁用滚动
Scroll() {
  // 内容...
}
.scrollable(ScrollDirection.None)

5.2 滚动条控制

// 隐藏滚动条(萌宠日记使用)
Scroll() {
  // 内容...
}
.scrollBar(BarState.Off)

// 显示滚动条
Scroll() {
  // 内容...
}
.scrollBar(BarState.On)

// 自动显示(内容超出时显示)
Scroll() {
  // 内容...
}
.scrollBar(BarState.Auto)

六、边缘回弹效果

6.1 EdgeEffect 效果

// 弹性回弹(默认效果,类似 iOS)
Scroll() {
  // 内容...
}
.edgeEffect(EdgeEffect.Spring)

// 无回弹效果
Scroll() {
  // 内容...
}
.edgeEffect(EdgeEffect.None)
效果说明用户体验
Spring弹性回弹,拖拽到边缘时有弹性效果柔和、自然
None无回弹,拖拽到边缘即停止硬朗、直接

七、滚动事件监听

7.1 滚动位置监听

@Entry
@Component
export struct HomePage {
  private scroller: Scroller = new Scroller()
  @State scrollPosition: number = 0

  build() {
    Scroll(this.scroller) {
      Column({ space: 16 }) {
        // 内容...
      }
    }
    .onDidScroll((xOffset: number, yOffset: number) => {
      this.scrollPosition = yOffset
      // 可用于实现:顶部阴影、悬浮效果等
    })
    .onScrollStart(() => {
      console.log('Scroll started')
    })
    .onScrollStop(() => {
      console.log('Scroll stopped at:', this.scrollPosition)
    })
  }
}

7.2 滚动事件应用

事件触发时机应用场景
onDidScroll滚动过程中持续触发记录位置、更新 UI
onScrollStart滚动开始时触发暂停动画
onScrollStop滚动停止时触发加载更多数据

八、嵌套滚动问题

8.1 滚动冲突

当 Scroll 内部嵌套 List 或 Grid 时,可能出现滚动冲突:

// 避免嵌套滚动冲突
Scroll() {
  Column({ space: 16 }) {
    // 使用 List 设置 nestedScroll
    List({ space: 0 }) {
      // 列表项...
    }
    .nestedScroll({
      scrollForward: NestedScrollMode.SELF_FIRST,
      scrollBackward: NestedScrollMode.SELF_FIRST
    })
  }
}

8.2 萌宠日记的处理

萌宠日记的首页没有嵌套滚动冲突,因为:

  • Scroll 内部直接使用 Column 和 Row,不嵌套 List/Grid
  • 所有内容区块都是固定高度的 Column
  • 当内容超出屏幕高度时,由外层的 Scroll 统一处理滚动

九、滚动性能优化

9.1 性能建议

  • 避免过度嵌套:Scroll 内部不宜嵌套过多的容器组件
  • 使用 LazyForEach:长列表使用 LazyForEach 懒加载
  • 减少重绘:避免在滚动事件中频繁修改状态
  • 图片优化:使用合适尺寸的图片,避免大图

9.2 性能对比

布局方式渲染性能适用场景
Scroll + Column优秀内容区块较少(≤ 10 个)
Scroll + List良好动态列表数据
Scroll + Grid良好网格布局
多层嵌套较差避免使用

十、最佳实践

10.1 Scroll 布局设计原则

有序列表 — Scroll 布局的 5 个原则:

  1. 单一根节点:Scroll 内部只能有一个根组件,通常使用 Column
  2. 合理间距:使用 Column 的 space 参数控制区块间距
  3. 统一边距:左右边距保持统一,推荐 16vp
  4. 隐藏滚动条:移动端通常隐藏滚动条,界面更简洁
  5. 避免嵌套:尽量避免 Scroll 嵌套 Scroll,会造成滚动冲突

10.2 萌宠日记的布局配置总结

配置项说明
外层容器Scroll可滚动容器
内部容器Column垂直排列
间距16vp区块间间距
滚动条BarState.Off隐藏
滚动方向Vertical垂直滚动
背景色#FFF8F0页面主背景色
内容区块5 个标题、宠物、操作、记录、提醒

总结

本文从 萌宠日记首页布局结构 出发,深入解析了 Scroll 嵌套 Column 的完整实现:

  1. 布局架构:Scroll 作为可滚动容器,Column 作为垂直排列容器
  2. Scroll 组件:核心属性、滚动方向、滚动条控制、边缘回弹
  3. Column 布局:间距控制、对齐方式、内边距
  4. 内容区块:5 个区块的拆分与封装
  5. 滚动事件:位置监听、滚动开始/停止事件
  6. 嵌套滚动:避免滚动冲突的策略
  7. 性能优化:减少嵌套、懒加载、图片优化
  8. 最佳实践:布局设计原则和配置总结

Scroll 嵌套 Column 是 ArkUI 中最基础的布局模式,掌握它能为构建更复杂的页面打下坚实基础。

下一篇我们将深入 宠物信息卡片设计与阴影效果,解析卡片的视觉设计细节。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐