鸿蒙应用ArtTS开发---底部切换(tab)和角标组件(Badge)

项目场景:

        在线上大部分app很常见的功能,底部导航切换附带消息角标提示。


Tabs 组件:

        通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。

        仅可包含子组件TabContent


Badge 组件:

        可以附加在单个组件上用于信息标记的容器组件。

        支持单个子组件。

 注意:Badge 组件使用的时候要设置具体宽高,否则会铺满父组件。

组件的具体属性介绍可以去官网指南或者查看其他文章了解一下


整体思路:

        通过Tabs组件中的子组件TabContent引用底部导航对应的页面组件,通过if判断下标把需要角标的导航部分用Badge组件进行替换。

// tabBar(this.TabBuilder("底部导航文本", 数字下标, "点击状态图片路径", "被点击状态图片路径")
tabBar(this.TabBuilder($r('app.string.tabBar_There'), 2, $r("app.media.mineCopy"), $r("app.media.mine"))
import { Index } from "./index/Index"
import { message } from "./message/message"
import { mine } from "./mine/mine"

@Entry
@Component
struct TabsPage {
  @State messageNum: string = '1'; // 消息数量
  @State currentIndex: number = 0; // 下标
  private tabsController: TabsController = new TabsController()
  // 底部导航切换函数
  @Builder TabBuilder(title: string, targetIndex: number, normalImg: Resource, selectedImg: Resource) {
    Column() {
      if (targetIndex === 1) { // 角标导航部分单独做处理
        Badge({
          value: this.messageNum,
          style: { fontSize: 12, badgeSize: 14, badgeColor: '#FA2A2D' }
        }) {
          Column() {
            Image(this.currentIndex === targetIndex ? normalImg : selectedImg)
              .width(28)
              .height(28)

            Text($r('app.string.tabBar_two'))
              .margin({ top: 4 })
              .fontSize(14)
              .fontColor(this.currentIndex === targetIndex ? '#103897' : '#999999')
          }
        }.width('30%').height('80%')
      } else {
        Image(this.currentIndex === targetIndex ? normalImg : selectedImg)
          .width(28)
          .height(28)
        Text(title)
          .fontSize(14)
          .margin({ top: 4 })
          .fontColor(this.currentIndex === targetIndex ? '#103897' : '#999999')
      }
    }
    .width('100%')
    .height(60)
    .justifyContent(FlexAlign.Center)
    .backgroundColor("rgb(247, 247, 250)")
    .onClick(() => {
      this.currentIndex = targetIndex
      this.tabsController.changeIndex(this.currentIndex)
    })
  }
  // tabs 底部导航切换组件
  build() {
    Column() {
      Tabs({ barPosition: BarPosition.End, controller: this.tabsController, index: 0 }) {
        TabContent() {
          Index()
          // @ts-ignore
        }.tabBar(this.TabBuilder($r('app.string.tabBar_one'), 0, $r("app.media.indexCopy"), $r("app.media.index")))

        TabContent() {
          message()
          // @ts-ignore
        }.tabBar(this.TabBuilder($r('app.string.tabBar_two'), 1, $r("app.media.myNews"), $r("app.media.myNewsCopy")))

        TabContent() {
          mine()
          // @ts-ignore
        }.tabBar(this.TabBuilder($r('app.string.tabBar_There'), 2, $r("app.media.mineCopy"), $r("app.media.mine")))
      }
      .scrollable(false) //去掉左右滑动的效果
      .animationDuration(0) //去掉左右滑动的动画
    }
    .width('100%')
    .height('100%')
    .backgroundColor("#fff")
  }
}

后续的鸿蒙开发中,有遇到有意思的部分也会继续分享给大家!

如果有不理解的地方,可以分享出来一起研究哦~

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亭瞳^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值