首页 > 其他分享 >手把手教你华为鸿蒙开发之第十节

手把手教你华为鸿蒙开发之第十节

时间:2024-12-10 21:00:23浏览次数:4  
标签:TabContent 鸿蒙 Tabs 手把手 app 第十节 tabBar Text ic

华为鸿蒙开发:深入探索Tabs组件的定制与应用

引言

在移动应用设计中,标签页(Tabs)是用户切换不同内容区块的重要界面元素。华为鸿蒙操作系统提供的Tabs组件支持开发者创建高度定制化的标签页界面。本文将通过 DevEco Studio 详细介绍Tabs组件的使用,包括基本设置、动态生成标签页、以及如何通过自定义组件来实现独特的视觉效果。

Tabs组件基础

Tabs组件允许开发者创建一组可滑动的标签页,每个标签页对应不同的内容区域。

基本使用

示例1:创建基础Tabs标签页

@Entry
@Component
struct Index {
  build() {
    Tabs() {
      TabContent() {
        Text('探索内容') // 有且只能一个子组件
      }
      .tabBar('探索') // 配置导航

      TabContent() {
        Text('趋势内容') // 有且只能一个子组件
      }
      .tabBar('趋势')

      TabContent() {
        Text('热点内容') // 有且只能一个子组件
      }
      .tabBar('热点')

      TabContent() {
        Text('个人中心内容') // 有且只能一个子组件
      }
      .tabBar('个人中心')
    }
  }
}

在这个示例中,我们创建了一个包含四个标签页的Tabs组件,每个标签页显示不同主题的文本内容。

配置导航

示例2:配置Tabs导航属性

@Entry
@Component
struct Index {
  build() {
    Tabs({
      barPosition: BarPosition.Start // 导航位置
    })
    {
      TabContent() {
        Text('探索内容')
      }
      .tabBar('探索')

      TabContent() {
        Text('趋势内容')
      }
      .tabBar('趋势')

      TabContent() {
        Text('热点内容')
      }
      .tabBar('热点')

      TabContent() {
        Text('个人中心内容')
      }
      .tabBar('个人中心')
    }
    .vertical(false) // 调整导航水平或垂直
    .scrollable(false) // 是否开启手势滑动
    .animationDuration(0) // 点击滑动的动画时间
  }
}

在这个示例中,我们配置了Tabs组件的导航属性,包括导航位置、滚动手势和动画时间。

动态生成Tabs

示例3:使用ForEach动态生成Tabs

@Entry
@Component
struct Index {
  titles: string[] = [
    '探索', '趋势', '热点', '科技', '娱乐',
    '体育', '教育', '健康', '财经', '旅游'
  ]

  build() {
    Tabs() {
      ForEach(this.titles, (item: string, index) => {
        TabContent() {
          Text(`${item}内容`)
        }
        .tabBar(item)
      })
    }
    .barMode(BarMode.Scrollable) // 实现滚动导航栏
  }
}

在这个示例中,我们使用ForEach循环动态生成了10个标签页,每个标签页的标题都是从titles数组中获取的。

自定义Tabs样式

示例4:自定义Tabs样式

@Entry
@Component
struct Index {
  @Builder
  myBuilder(title: string, img: ResourceStr) {
    Column() {
      Image(img)
        .width(30)
      Text(title)
    }
  }

  build() {
    Tabs({
      barPosition: BarPosition.End
    })
    {
      TabContent() {
        Text('消息中心内容')
      }
      .tabBar(this.myBuilder('消息中心', $r('app.media.ic_tabbar_icon_1')))

      TabContent() {
        Text('设置中心内容')
      }
      .tabBar(this.myBuilder('设置中心', $r('app.media.ic_tabbar_icon_2')))
    }
  }
}

在这个示例中,我们定义了一个@Builder函数myBuilder来自定义每个标签页的样式,包括图片和文本。

状态管理

示例5:管理Tabs激活状态

@Entry
@Component
struct Index {
  @State selectedIndex: number = 0

  @Builder
  myBuilder(itemIndex: number, title: string, img: ResourceStr, selImg: ResourceStr) {
    Column() {
      Image(itemIndex == this.selectedIndex ? selImg : img)
        .width(30)
      Text(title)
        .fontColor(itemIndex == this.selectedIndex ? Color.Red : Color.Black)
    }
  }

  build() {
    Tabs()
    {
      TabContent() {
        Text('消息中心内容')
      }
      .tabBar(this.myBuilder(0, '消息中心', $r('app.media.ic_tabbar_icon_1'), $r('app.media.ic_tabbar_icon_1_selected')))

      TabContent() {
        Text('设置中心内容')
      }
      .tabBar(this.myBuilder(1, '设置中心', $r('app.media.ic_tabbar_icon_2'), $r('app.media.ic_tabbar_icon_2_selected')))
    }
    .onChange((index: number) => {
      this.selectedIndex = index
    })
    .animationDuration(0)
    .scrollable(false)
  }
}

在这个示例中,我们使用@State属性selectedIndex来存储当前激活的标签页索引,并在onChange事件中更新这个索引。

特殊形状的Tab

示例6:添加特殊形状的Tab

@Entry
@Component
struct Index {
  @State selectedIndex: number = 0

  @Builder
  myBuilder(itemIndex: number, title: string, img: ResourceStr, selImg: ResourceStr) {
    Column() {
      Image(itemIndex == this.selectedIndex ? selImg : img)
        .width(30)
      Text(title)
        .fontColor(itemIndex == this.selectedIndex ? Color.Red : Color.Black)
    }
  }

  @Builder
  centerBuilder() {
    Image($r('app.media.ic_special_icon'))
      .width(40)
      .margin({ bottom: 10 })
  }

  build() {
    Tabs()
    {
      TabContent() {
        Text('首页内容')
      }
      .tabBar(this.myBuilder(0, '首页', $r('app.media.ic_tabbar_icon_0'), $r('app.media.ic_tabbar_icon_0_selected')))

      TabContent() {
        Text('分类内容')
      }
      .tabBar(this.myBuilder(1, '分类', $r('app.media.ic_tabbar_icon_1'), $r('app.media.ic_tabbar_icon_1_selected')))

      TabContent() {
        Text('活动内容')
      }
      .tabBar(this.centerBuilder())

      TabContent() {
        Text('购物车内容')
      }
      .tabBar(this.myBuilder(3, '购物车', $r('app.media.ic_tabbar_icon_2'), $r('app.media.ic_tabbar_icon_2_selected')))

      TabContent() {
        Text('个人中心内容')
      }
      .tabBar(this.myBuilder(4, '个人中心', $r('app.media.ic_tabbar_icon_3'), $r('app.media.ic_tabbar_icon_3_selected')))
    }
    .onChange((index: number) => {
      this.selectedIndex = index
    })
    .animationDuration(0)
    .scrollable(false)
  }
}

在这个示例中,我们添加了一个特殊形状的标签页,并使用centerBuilder函数来自定义其样式。

结语

通过本文的详细介绍和示例,你应该能够掌握Tabs组件的基本使用、自定义样式以及状态管理。这些技能对于开发具有丰富标签页功能的鸿蒙应用至关重要。如果你有任何问题或想要进一步讨论,欢迎在评论区留下你的想法。


以上就是一篇关于华为鸿蒙开发中Tabs组件的详细教程。希望这篇文章能帮助你更好地理解和使用华为鸿蒙开发中的Tabs组件。如果你在使用 DevEco Studio 进行开发时遇到任何问题,欢迎交流讨论。

标签:TabContent,鸿蒙,Tabs,手把手,app,第十节,tabBar,Text,ic
From: https://www.cnblogs.com/Thewang/p/18598001

相关文章

  • 手把手教你用python一键抢12306火车票(附代码)
    源码直接在pycharm里面打开即可用github链接:w1a2b3c/123061:12306抢票脚本,学生票,为了买票纯手写gitee链接:eric/12306抢票脚本,学生票,为了买票纯手写哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕…然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现......
  • 鸿蒙 Next 中 Provide 和 Consume 的用法总结
    一、概述在鸿蒙Next中,@Provide和@Consume装饰器用于在祖先组件与后代组件之间实现双向数据同步,适用于状态数据在多个层级之间传递的场景,摆脱了父子组件间命名参数传递机制的束缚。从APIversion9开始,这两个装饰器支持在ArkTS卡片中使用,从APIversion11开始,支持在元服务中使用。......
  • 鸿蒙 Next 中 Prop 的用法详解
    一、@Prop概述在鸿蒙Next中,@Prop装饰器用于在父子组件之间建立单向的数据同步关系。这意味着数据从父组件流向子组件,子组件对@Prop装饰变量的修改不会同步回父组件。从APIversion9开始,该装饰器支持在ArkTS卡片中使用,从APIversion11开始,支持在元服务中使用。(一)同步机制父组......
  • 鸿蒙原生开发环境的创新与性能优化:从工具到跨平台支持的全方位提升
    鸿蒙原生开发环境的创新与性能优化:从工具到跨平台支持的全方位提升一、引言随着鸿蒙操作系统的不断发展,开发者对开发工具的要求也在逐渐提高。高效、智能的开发工具不仅能够帮助开发者快速实现创意,还能在开发过程中提供更好的支持和体验。本文将深入探讨鸿蒙原生开发中的......
  • 同一套RN代码,运行在原生鸿蒙端结果不一样?
    一、创作背景我最近开发鸿蒙的时候碰到一个很奇怪的问题,在这里给大家分享一下。如果后面大家也碰到类似的问题,可以作为修改参考。二、问题描述RN鸿蒙端开发的时候,可能碰到调试时和正式发版时展示效果不一致的情况。我这里有一段最简单的JS代码,只有一个View和一个Text,具体代码......
  • OpenHarmony默认30秒熄屏太麻烦?触觉智能鸿蒙开发板教你轻松取消
    开发板在默认情况下,OpenHarmony系统开机后30秒会自动息屏,自动息屏会让不少用户感到麻烦,触觉智能教大家两招轻松取消自动息屏。使用触觉智能PurplePiOH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新OpenHarmony5.0Release系统,SDK源码全开放!S......
  • 【鸿蒙开发基础】@Styles修饰符
    1.@Styles修饰符是什么?@Styles修饰符用于保存公共属性,公共属性就是给每一个组件都可以设置的属性,比如宽度和高度,或者圆角设置,有些是特殊属性,只能给特定的组件进行设置,比如Text()可以设置的特殊属性有fontStyle和fontWeight。在Row()组件中就无法设置这两个属性,这是Text()所特......
  • 【鸿蒙开发】ArkTS --“必备”面试题
    系列文章目录【鸿蒙开发】ArkTS--“必备”面试题【鸿蒙开发】ArkTS--“必备”面试题文章目录系列文章目录前言一、什么是类型断言?二、装饰器介绍前言一、什么是类型断言?类型断言允许程序员手动指定一个值的类型。这在需要明确告诉编译器某个值的类型时非常有......
  • 鸿蒙UI开发快速入门 —— part11: 鸿蒙计算器开发实践
    1、前言经过我们前面10章的学习,我们基本上可以开发出一个简单的APP了,为了巩固学习的内容,我们先开发一个计算器APP来连个手(文末有源代码),界面如下:包含基本的计算器运算功能支持一键清空,支持逐个删除数字支持将上次计算的过程保存下来,下次打开app继续;支持清理之前保存......
  • 鸿蒙UI开发快速入门 —— part12: 渲染控制
    1、前言在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快速生成组件的循环渲染语句。2、条件渲染假设我们存在这样一个应用场景:当我们的界面在满足某种条件时,需要显示一些组......