HarmonyOS鸿蒙tabBar的详细讲解

tabBar的基本使用(默认在顶部)

scss 复制代码
@Entry
@Component
struct Index {
  build() {
     Tabs(){
       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是消息中的内容")
       }.tabBar("消息")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是联系人中的内容")
       }.tabBar("联系人")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是动态中的内容")
       }.tabBar("动态")
     }
  }
}

通过 barPosition来调整tabBar位置

barPosition:BarPosition.Start 在顶部/左侧

barPosition:BarPosition.End 在底部/右侧

scss 复制代码
@Entry
@Component
struct Index {
  build() {
     // barPosition:BarPosition.Start 在顶部
     // barPosition:BarPosition.End 在顶部
     Tabs({barPosition:BarPosition.End}){
       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是消息中的内容")
       }.tabBar("消息")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是联系人中的内容")
       }.tabBar("联系人")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是动态中的内容")
       }.tabBar("动态")
     }
  }
}

vertical 调整导航的位置,是水平(true)还是垂直(false)

scss 复制代码
@Entry
@Component
struct Index {
  build() {
     // barPosition:BarPosition.Start 在顶部/左侧
     // barPosition:BarPosition.End 在尾部/右侧

     Tabs({barPosition:BarPosition.End}){
       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是消息中的内容")
       }.tabBar("消息")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是联系人中的内容")
       }.tabBar("联系人")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是动态中的内容")
       }.tabBar("动态")
     }.vertical(true) // 调整导航的位置,是水平(true)还是垂直(false);
  }
}

scrollable:是否通过手势滑动切换内容

scss 复制代码
@Entry
@Component
struct Index {
  build() {
     // barPosition:BarPosition.Start 在顶部/左侧
     // barPosition:BarPosition.End 在顶部/右侧
     Tabs({barPosition:BarPosition.End}){
       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是消息中的内容")
       }.tabBar("消息")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是联系人中的内容")
       }.tabBar("联系人")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是动态中的内容")
       }.tabBar("动态")
     }.vertical(false) // 调整导航的位置,是水平(true)还是垂直(false);
      .scrollable(false) // 是否通过手势滑动切换(手指向右向左可以滑动) false不允许;true可以
  }
}

animationDuration:切换动画的时间

scss 复制代码
@Entry
@Component
struct Index {
  build() {
     // barPosition:BarPosition.Start 在顶部/左侧
     // barPosition:BarPosition.End 在顶部/右侧
     //
     Tabs({barPosition:BarPosition.End}){
       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是消息中的内容")
       }.tabBar("消息")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是联系人中的内容")
       }.tabBar("联系人")

       TabContent(){
         // TabContent下只能有一个子组件哈
         Text("我是动态中的内容")
       }.tabBar("动态")
     }.vertical(false) // 调整导航的位置,是水平(true)还是垂直(false);
      .scrollable(false) // 是否通过手势滑动切换(手指向右向左可以滑动) false不允许;true可以
      .animationDuration(300) // 切换动画的时间,毫秒
  }
}

很多时候,特别是新闻类的app;

会有很多的tabBar他们是可以进行滚动切换的。

我们可以通过barMode(BarMode.Scrollable)来进行设置,让它滚动

请看下面的例子

很多Tabs标签的时候可以进行滚动

scss 复制代码
@Entry
@Component
struct Index {
  @State titleArr:string[]=['首页1','首页12','首页13','首页14','首页15','首页16','首页17','首页18','首页19',]
  build() {
     Tabs({barPosition:BarPosition.Start}){
       ForEach(this.titleArr,(item:string, index:number)=>{
           TabContent(){
             // TabContent下只能有一个子组件哈
             Text(`我是${item}中的内容`)
           }.tabBar(item)
       })
     }.vertical(false) // 调整导航的位置,是水平(true)还是垂直(false);
      .scrollable(true) // 是否通过手势滑动切换(手指向右向左可以滑动) false不允许;true可以
      .barMode(BarMode.Scrollable)
  }
}

TabBar相关的事件

onTabBarClick事件是Tab页签点击后触发的事件。
typescript 复制代码
Tabs(){}
  .onTabBarClick((order:number)=>{
     // 多次重新点击也会触发,order表示的是点击的tabBar元素下标
     console.log('你点击了这个tab', order)
   })
onChange事件,Tab页签切换后触发的事件。

语法:onChange(event: (index: number) => void)

满足以下任一条件,即可触发该事件:

1、滑动页面进行页面切换时,组件滑动动画结束后触发。

2、通过控制器调用changeIndex接口,Tab页签切换后触发。

3、动态修改状态变量构造的index属性值,Tab页签切换后触发。

4、点击TabBar页签,Tab页签切换后触发。

特殊说明:

使用自定义页签时,在onChange事件中联动可能会导致滑动页面切换后才执行页签联动,引起自定义页签切换效果延迟。

建议在onAnimationStart中监听并刷新当前索引,以确保动效能够及时触发

更改svg图标的颜色

fillColor(value: ResourceColor) 设置填充颜色,设置后填充颜色会覆盖在图片上。

仅对svg图源生效,设置后会替换svg图片中所有可绘制元素的填充颜色。

如需对png图片进行修改颜色,可以使用colorFilter。

scss 复制代码
Image($r("app.media.图标名称")).width(26).height(26).margin({bottom:20}).fillColor(Color.Red)
Image($r("app.media.图标名称")).width(26).height(26).margin({bottom:20}).fillColor(Color.Pink)

切换实现TabBar高亮效果

实现的思路是:通过onChange事件记录当前点击的是哪一个TabBar

然后通过fillColor属性控制svg图片的颜色,点击的那个TabBar进行变色。

fontColor控制文本的颜色,下面我们就一起来看下

less 复制代码
@Entry
@Component
struct Index {
  @State selectIndex:number = 0
  @State activeTextColor:string = "#f9f"
  @Builder
  customBuilder(title:string,iconUrl:string,index:number){
    Column(){
      // rgba(0,0,0,0.9019607843137255)
      Image($r(iconUrl)).width(20).fillColor(this.selectIndex==index ? this.activeTextColor : '')
      Text(title)
        .fontColor(this.selectIndex==index ? this.activeTextColor : '#000') // 更改文字的颜色,通过下标来更改哈
    }
  }
  build() {
     Tabs({ barPosition:BarPosition.End}){
       TabContent(){
         Text("历史内容")
       }.tabBar(this.customBuilder('历史', 'app.media.history',0))

       TabContent(){
         Text("更多内容")
       }.tabBar(this.customBuilder('更多', 'app.media.more',1))
     }.onChange((index:number)=>{
       // 这个事件是在切换的时候就会被触发,可以得到索引,从下标是0开始
       this.selectIndex = index
       console.log('索引', index)
     })
  }
}

尾声

掘有们,今天周五啦。好好复习一下,参加明天的考试。

相关推荐
一只大侠的侠3 小时前
Flutter开源鸿蒙跨平台训练营 Day 10特惠推荐数据的获取与渲染
flutter·开源·harmonyos
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60616 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅6 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊7 小时前
jwt介绍
前端