📖 本文基于HarmonyOS ArkUI框架的学习与实战整理,涵盖从Scroll滚动布局到Tabs多页导航的完整知识链条。
除了语法与API讲解,更融入了实际项目经验与个人理解,特别是“京东小火箭回顶”动画案例与自定义Tabs切换效果,让你的鸿蒙App更有交互力和质感!

一、Scroll滚动组件基础详解 🚀

  1. Scroll的定义

在ArkUI中,Scroll是用于实现滚动视图的组件。
它能让用户在内容超出屏幕范围时进行滑动查看,类似于Web开发中的overflow: scroll。

📘 官方定义:

Scroll是一个可滚动的容器,支持垂直或水平方向的滑动显示,用于展示长列表、内容详情页等场景。

2. Scroll的语法结构

Scroll() {
  Column() {
    // 滚动内容
    Text('鸿蒙ArkUI Scroll演示').fontSize(20)
    // ...
  }
}
.scrollable(ScrollDirection.Vertical)

常见属性:

属性名 功能说明
scrollable(direction) 设置滚动方向(水平/垂直)
onScroll(callback) 监听滚动事件
scrollBar(DisplayMode) 设置滚动条显示方式

📍个人理解:
Scroll 是整个ArkUI交互系统中“信息承载量”的核心,它让界面在有限空间里变得无限延展;通过与状态变量配合,能轻松实现交互式动画与内容联动。

二、Scroll滚动监听与偏移控制 🎯

@State offsetY: number = 0

Scroll() {
  Column() {
    Text(`当前滚动距离: ${this.offsetY}`)
  }
}
.onScroll((x, y) => {
  this.offsetY = y
})

📘 定义:
onScroll事件可实时监听用户滚动过程中的位置偏移量。

💡 个人理解:
当掌握滚动位置的实时变化后,我们能驱动整个UI的动态表现,比如导航栏渐隐、按钮显隐、背景缩放等,滚动偏移量几乎能成为“动画触发器”。

三、京东小火箭动效实现 🔥

Scroll的一个经典应用场景就是“回到顶部按钮”,最具代表性的就是京东App的小火箭动画。

  1. 动效实现思路

  2. 当滚动距离超过一定值时显示火箭图标;

  3. 点击火箭后触发动画回顶;

  4. 动画结束后隐藏火箭。

  5. 实现代码

@Entry
@Component
struct JDRocketScroll {
  @State offsetY: number = 0
  @State showRocket: boolean = false

  build() {
    Stack() {
      Scroll() {
        Column() {
          ForEach(Array.from({ length: 40 }, (_, i) => i), (item) => {
            Text(`商品列表 ${item}`).fontSize(20).padding(8)
          })
        }
      }
      .onScroll((x, y) => {
        this.offsetY = y
        this.showRocket = y > 500
      })

      if (this.showRocket) {
        Image($r('app.media.rocket'))
          .width(60).height(60)
          .position({ x: 320, y: 600 })
          .onClick(() => {
            animateTo({ duration: 800 }, () => {
              this.offsetY = 0
            })
          })
      }
    }
  }
}

🎯 功能亮点:

  • 动态监听滚动位置;
  • 火箭图标出现与隐藏由状态控制;
  • 动画驱动实现平滑回顶。

💬 个人理解:
这是“声明式动画+状态驱动”完美结合的例子。
在ArkUI中不再需要繁杂的逻辑,只要状态改变,UI自然响应,非常适合初学者理解动画机制。

四、布局样式与空间控制 ✨

鸿蒙ArkUI中,视觉布局与交互体验密切相关,以下是常用样式属性:

.width('100%')
.backgroundColor(Color.White)
.borderRadius(10)
.padding({ left: 10, right: 10, top: 8, bottom: 8 })
.offset({ x: 0, y: this.offsetY })
属性 作用说明
width() 控制组件宽度
backgroundColor() 背景色设置
borderRadius() 圆角控制
padding() 内边距设置
offset() 位移偏移,用于动画或位置微调

🧠 个人理解:
offset 是实现动态布局的关键,它不仅能控制元素的位移,还能与animateTo结合实现自然过渡效果。

五、Tabs导航栏组件详解 🧭

Tabs 是ArkUI提供的多页导航组件,用于在多个内容页面之间快速切换。
常见于首页/分类/我的 这类多页结构。

1. 基本结构与定义

Tabs({ barPosition: BarPosition.Start }) {
  TabContent() {
    Text('首页内容')
  }.tabBar('首页')

  TabContent() {
    Text('我的内容')
  }.tabBar('我的')
}

📘 定义:
Tabs用于在多个页面或视图之间进行切换,TabContent定义每个页面内容,tabBar()定义标签显示。

属性 功能
barPosition Tab栏位置(顶部/底部)
barMode 显示模式(固定或可滚动)
scrollable 是否支持滑动切换
index 当前选中索引

💬 个人理解:
Tabs 就像“页面导航器”,能快速组织多模块页面结构。
结合Scroll可以实现完整的商城主页逻辑。

2. 自定义Tabs样式

Tabs({ barPosition: BarPosition.Start, barMode: BarMode.Scrollable }) {
  TabContent() {
    Text('Tab 1 内容')
  }.tabBar('商品')

  TabContent() {
    Text('Tab 2 内容')
  }.tabBar('订单')

  TabContent() {
    Text('Tab 3 内容')
  }.tabBar('我的')
}

📍说明:

  • BarMode.Scrollable 可让Tab栏横向滑动;
  • 适合分类较多的场景(如新闻栏目、商品种类)。

🧠 个人理解:
Tab在UI中不只是切换内容的按钮,更是用户心理上的“路径标记”,它帮助用户在多层信息结构中建立位置感。

3. Tabs索引与交互控制

@Entry
@Component
struct TabExample {
  @State index: number = 1

  build() {
    Tabs({ index: this.index }) {
      TabContent() {
        Text('首页')
      }.tabBar('Home')

      TabContent() {
        Text('设置')
      }.tabBar('Settings')
    }
    .onChange((index) => {
      console.log('当前选中索引:', index)
    })
  }
}

💡 定义:

  • index:用于控制默认显示的Tab页;
  • onChange():监听Tab切换事件。

💬 个人理解:
通过绑定@State index,我们可以让Tabs与业务逻辑数据联动,实现更智能的切换体验(例如切换分类自动刷新内容)。

六、Tabs + Scroll综合案例:商城多页展示 💼

@Entry
@Component
struct MallPage {
  @State tabIndex: number = 0

  build() {
    Tabs({ index: this.tabIndex, barMode: BarMode.Scrollable }) {
      TabContent() {
        Scroll() {
          Column() {
            ForEach(['手机', '电脑', '家电'], (item) => {
              Text(`🔥 热门商品:${item}`).fontSize(22).padding(10)
            })
          }
        }
      }.tabBar('推荐')

      TabContent() {
        Text('分类列表')
      }.tabBar('分类')

      TabContent() {
        Text('购物车')
      }.tabBar('购物车')
    }
  }
}

🎨 效果展示:

  • 每个Tab对应一个模块页面;
  • 内部嵌套Scroll显示大量商品;
  • 页面逻辑清晰,结构层次分明。

💬 个人理解:
这是Tabs与Scroll结合的典型设计思路,在鸿蒙App首页、资讯页、商城页等项目中非常常见。

七、总结与延伸 💬

通过本文我们掌握了:
✅ Scroll的定义与滚动监听
✅ 京东小火箭动效原理与实现
✅ ArkUI布局样式属性解析
✅ Tabs导航栏的结构与交互控制
✅ 综合案例:Tabs + Scroll的页面融合

📚 学习建议:

  1. 多用@State管理UI状态;
  2. 动画逻辑使用animateTo()统一封装;
  3. 练习Tabs与Scroll嵌套使用;
  4. 每个界面功能尽量模块化,方便复用。

💬 个人理解总结:
鸿蒙ArkUI的核心思想是声明式UI + 状态驱动。
你无需命令系统“怎么变化”,只需定义“变化条件”,UI就会自动响应。
这正是鸿蒙开发高效与优雅的精髓所在。

📘 推荐阅读方向:

  • 动画系统:animateTo、TransitionEffect
  • 自定义组件:@Builder封装
  • 状态管理:@State、@Prop、@Link
  • 页面路由与导航:router.pushUrl()

恭喜您,迈出了鸿蒙应用开发坚实的一步!🎉

🤔 接下来,我将继续为大家更新鸿蒙开发的相关知识点,如果喜欢,记得关注驻波。

✅ 如果你觉得这篇 ArkUI 学习笔记对你有帮助,记得 点赞 + 收藏,关注我获取更多鸿蒙开发干货!📝 有任何问题欢迎在评论区留言,我们一起交流学习!

Logo

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

更多推荐