HarmonyOS ArkUI --- Tabs组件的使用

概述

在我们常用的应用中,经常会有视图内容切换的场景,来展示更加丰富的内容。比如下面这个页面,点击底部的页签的选项,可以实现“首页”和“我的”

两个内容视图的切换。

ArkUI开发框架提供了一种页签容器组件Tabs,开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器Tabs的形式多种多样,不同的页面设计页签不一样,可以把页签设置在底部、顶部或者侧边。

本文将详细介绍Tabs组件的使用。

Tabs组件的简单使用

Tabs组件仅可包含子组件TabContent,每一个页签对应一个内容视图即TabContent组件。下面的示例代码构建了一个简单的页签页面:

 
  1. @Entry
  2. @Component
  3. struct TabsExample {
  4. private controller: TabsController = new TabsController()
  5. build() {
  6. Column() {
  7. Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
  8. TabContent() {
  9. Column().width('100%').height('100%').backgroundColor(Color.Green)
  10. }
  11. .tabBar('green')
  12. TabContent() {
  13. Column().width('100%').height('100%').backgroundColor(Color.Blue)
  14. }
  15. .tabBar('blue')
  16. TabContent() {
  17. Column().width('100%').height('100%').backgroundColor(Color.Yellow)
  18. }
  19. .tabBar('yellow')
  20. TabContent() {
  21. Column().width('100%').height('100%').backgroundColor(Color.Pink)
  22. }
  23. .tabBar('pink')
  24. }
  25. .barWidth('100%') // 设置TabBar宽度
  26. .barHeight(60) // 设置TabBar高度
  27. .width('100%') // 设置Tabs组件宽度
  28. .height('100%') // 设置Tabs组件高度
  29. .backgroundColor(0xF5F5F5) // 设置Tabs组件背景颜色
  30. }
  31. .width('100%')
  32. .height('100%')
  33. }
  34. }

效果图如下:

上面示例代码中,Tabs组件中包含4个子组件TabContent,通过TabContent的tabBar属性设置TabBar的显示内容。使用通用属性width和height设置了Tabs组件的宽高,使用barWidth和barHeight设置了TabBar的宽度和高度。

说明

  • TabContent组件不支持设置通用宽度属性,其宽度默认撑满Tabs父组件。
  • TabContent组件不支持设置通用高度属性,其高度由Tabs父组件高度与TabBar组件高度决定。

设置TabBar布局模式

因为Tabs的布局模式默认是Fixed的,所以Tabs的页签是不可滑动的。当页签比较多的时候,可能会导致页签显示不全,将布局模式设置为Scrollable的话,可以实现页签的滚动。

Tabs的布局模式有Fixed(默认)和Scrollable两种:

  • BarMode.Fixed:所有TabBar平均分配barWidth宽度(纵向时平均分配barHeight高度),页签不可滚动,效果图如下:

  • BarMode.Scrollable:每一个TabBar均使用实际布局宽度,超过总长度(横向Tabs的barWidth,纵向Tabs的barHeight)后可滑动。

  • 当页签比较多的时候,可以滑动页签,下面的示例代码将barMode设置为BarMode.Scrollable,实现了可滚动的页签:
 
  1. @Entry
  2. @Component
  3. struct TabsExample {
  4. private controller: TabsController = new TabsController()
  5. build() {
  6. Column() {
  7. Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {
  8. TabContent() {
  9. Column()
  10. .width('100%')
  11. .height('100%')
  12. .backgroundColor(Color.Green)
  13. }
  14. .tabBar('green')
  15. TabContent() {
  16. Column()
  17. .width('100%')
  18. .height('100%')
  19. .backgroundColor(Color.Blue)
  20. }
  21. .tabBar('blue')
  22. ...
  23. }
  24. .barMode(BarMode.Scrollable)
  25. .barWidth('100%')
  26. .barHeight(60)
  27. .width('100%')
  28. .height('100%')
  29. }
  30. }
  31. }

设置TabBar位置和排列方向

Tabs组件页签默认显示在顶部,某些场景下您可能希望Tabs页签出现在底部或者侧边,您可以使用Tabs组件接口中的参数barPosition设置页签位置。此外页签显示位置还与vertical属性相关联,vertical属性用于设置页签的排列方向,当vertical的属性值为false(默认值)时页签横向排列,为true时页签纵向排列。

barPosition的值可以设置为BarPosition.Start(默认值)和BarPosition.End:

  • BarPosition.Startvertical属性方法设置为false(默认值)时,页签位于容器顶部。
     
      
    1. Tabs({ barPosition: BarPosition.Start }) {
    2. ...
    3. }
    4. .vertical(false)
    5. .barWidth('100%')
    6. .barHeight(60)

    效果图如下:

    vertical属性方法设置为true时,页签位于容器左侧。

     
      
    1. Tabs({ barPosition: BarPosition.Start }) {
    2. ...
    3. }
    4. .vertical(true)
    5. .barWidth(100)
    6. .barHeight(200)

    效果图如下:

  • BarPosition.End

    vertical属性方法设置为false时,页签位于容器底部。

     
      
    1. Tabs({ barPosition: BarPosition.End }) {
    2. ...
    3. }
    4. .vertical(false)
    5. .barWidth('100%')
    6. .barHeight(60)

    效果图如下:

    vertical属性方法设置为true时,页签位于容器右侧。

     
      
    1. Tabs({ barPosition: BarPosition.End}) {
    2. ...
    3. }
    4. .vertical(true)
    5. .barWidth(100)
    6. .barHeight(200)

    效果图如下:

自定义TabBar样式

TabBar的默认显示效果如下所示:

往往开发过程中,UX给我们的设计效果可能并不是这样的,比如下面的这种底部页签效果:

TabContent的tabBar属性除了支持string类型,还支持使用@Builder装饰器修饰的函数。您可以使用@Builder装饰器,构造一个生成自定义TabBar样式的函数,实现上面的底部页签效果,示例代码如下:

 
  1. @Entry
  2. @Component
  3. struct TabsExample {
  4. @State currentIndex: number = 0;
  5. private tabsController: TabsController = new TabsController();
  6. @Builder TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
  7. Column() {
  8. Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
  9. .size({ width: 25, height: 25 })
  10. Text(title)
  11. .fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
  12. }
  13. .width('100%')
  14. .height(50)
  15. .justifyContent(FlexAlign.Center)
  16. .onClick(() => {
  17. this.currentIndex = targetIndex;
  18. this.tabsController.changeIndex(this.currentIndex);
  19. })
  20. }
  21. build() {
  22. Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) {
  23. TabContent() {
  24. Column().width('100%').height('100%').backgroundColor('#00CB87')
  25. }
  26. .tabBar(this.TabBuilder('首页', 0, $r('app.media.home_selected'), $r('app.media.home_normal')))
  27. TabContent() {
  28. Column().width('100%').height('100%').backgroundColor('#007DFF')
  29. }
  30. .tabBar(this.TabBuilder('我的', 1, $r('app.media.mine_selected'), $r('app.media.mine_normal')))
  31. }
  32. .barWidth('100%')
  33. .barHeight(50)
  34. .onChange((index: number) => {
  35. this.currentIndex = index;
  36. })
  37. }
  38. }

示例代码中将barPosition的值设置为BarPosition.End,使页签显示在底部。使用@Builder修饰TabBuilder函数,生成由Image和Text组成的页签。同时也给Tabs组件设置了TabsController控制器,当点击某个页签时,调用changeIndex方法进行页签内容切换。

最后还需要给Tabs添加onChange事件,Tab页签切换后触发该事件,这样当我们左右滑动内容视图的时候,页签样式也会跟着改变。

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值