【鸿蒙应用ArkTS开发系列】- 导航栏Tab组件使用讲解

news2024/12/25 16:05:21

目录

    • Tabs介绍
    • Tabs使用例子
    • TabBar 样式设置
      • 定义菜单样式对象-NavigationItem
      • 定义一个底部菜单栏集合数据-NavigationList
      • 修改TabBuilder
    • Tab 组件控制
    • 题外话

现在市场上的大部分应用,主页都是才用底部导航栏菜单作为页面主体框架来展示,
在这里插入图片描述
在鸿蒙中是使用Tabs组件实现,下面我们开始讲解Tab组件的使用。

Tabs介绍

Tabs是一个通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图,它仅可包含子组件TabContent,同时搭配 TabsController使用。

TabsController 是Tabs组件的控制器,用于控制Tabs组件进行页签切换。不支持一个TabsController控制多个Tabs组件。
具体可查看官网介绍,这里就不多描述。

Tabs使用例子

@Entry
@Component
export struct MainPage {
  @State mCurrentPage: number = 0;
  private mTabController: TabsController = new TabsController()

  build() {
    Tabs({ barPosition: BarPosition.End, controller: this.mTabController }) {

      TabContent() {
        Text('第一个页面')
      }
      .tabBar(this.TabBuilder(0))

      TabContent() {
        Text('第二个页面')
      }
      .tabBar(this.TabBuilder(1))

      TabContent() {
        Text('第三个页面')
      }
      .tabBar(this.TabBuilder(2))

    }
    .scrollable(true)
    .vertical(false)
    .barMode(BarMode.Fixed)
    .onChange((index) => {
      this.mCurrentPage = index;
    })

  }

  @Builder TabBuilder(index: number) {
    Column() {
      Image(index == this.mCurrentPage ? $r('app.media.icon_selected'): $r('app.media.icon_normal'))
        .width('24vp')
        .height('24vp')
        .objectFit(ImageFit.Contain)
      Text('菜单')
        .fontSize('10fp')
        .fontWeight(500)
        .fontColor(this.mCurrentPage === index ? $r('app.color.blue_3d9dff') : $r('app.color.gray_999999'))
        .margin({ top: '4vp' })
    }.justifyContent(FlexAlign.Center)
  }
}

这里对上面代码进行讲解,

  1. 首先定义一个Tab容器组件,在其中摆放了三个TabContent子组件;
  2. 使用vertical属性跟barPosition: BarPosition.End配合即可以将导航栏显示在页面底部;
  3. 使用scrollable开启手势滑动切换tab页;
  4. 定义 onChange函数,可以监听tab页面切换事件,这里我们定义了一个全局变量记录当前tab显示子页索引,通过该值可对底部栏的图标跟文本进行样式高亮处理。
  5. 使用@Builder注解定义了一个TabBuilder的布局绘制方法,进行tab底部导航栏的绘制

上面代码是一个比较粗糙的例子,由于tabBar设置调用同一个TabBuilder,因此绘制后,每个底部菜单是一模一样的效果。

下面我们对其进行修改,让它支持多个不同菜单绘制

TabBar 样式设置

定义菜单样式对象-NavigationItem

export interface NavigationItem {
  id: number; 
  text: Resource; //文本
  icon_normal: Resource; // 默认图标
  icon_selected: Resource; // 选中图标
}

定义一个底部菜单栏集合数据-NavigationList

export const NavigationList: NavigationItem[] = [
  {
    icon_normal: $r('app.media.main_icon_home'),
    icon_selected: $r('app.media.main_icon_home'),
    text: $r('app.string.tab_home'),
    id: 0
  },
  {
    icon_normal: $r('app.media.main_icon_life'),
    icon_selected: $r('app.media.main_icon_life'),
    text: $r('app.string.tab_life'),
    id: 1
  },
  {
    icon_normal: $r('app.media.main_icon_user'),
    icon_selected: $r('app.media.main_icon_user'),
    text: $r('app.string.tab_user'),
    id: 2
  },
]

修改TabBuilder

@Builder TabBuilder(item: NavigationItem) {

     Column() {
        Image(this.mCurrentPage === this.getTabIndexByItem(item) ? item.icon_selected : item.icon_normal)
          .width('24vp')
          .height('24vp')
          .objectFit(ImageFit.Contain)

        Text(item.text)
          .fontSize('10fp')
          .fontWeight(500)
          .fontColor(this.mCurrentPage === this.getTabIndexByItem(item) ? $r('app.color_blue_3d9dff') : $r('app.color.gray_999999'))
          .margin({ top: '4vp' })
      }
      .justifyContent(FlexAlign.Center)
      .width('100%')
      .height('100%')
    }
  }

这里是根据NavigationItem ID动态找在数组中的索引。

getTabIndexByItem(navigationItem: NavigationItem): number {
    return this.mTabDataList.findIndex(item => item.id === navigationItem.id);
  }

通过传入一个NavigationItem,对TabBuilder中的组件样式进行动态配置。

Tab 组件控制

如果想要通过代码去控制tab切换到指定子页,可以使用 TabController来对tab进行控制,使用changeIndex函数进行切换。

题外话

本文到此结束,谢谢阅读,由于时间匆忙,只能进行简单讲解,一些tab滑动动画、tabItem的点击样式、tabbar分隔线的问题,后续有时间再进行补充。如有疑问,评论区沟通探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32库函数笔记分享

之前刚开始自学的部分STM32笔记放出,希望对新入门STM32和想要复习库函数的小伙伴们起到帮助。 建立工程 1.寄存器操作方式 需要不断地查手册来了解每一位是干什么用的 优点:代码简介; 缺点:不太方便。 2.库函数操作方式 1.调用库函…

【leetcode热题100】接雨水、直方图最大矩形面积、矩阵中最大的矩形

文章目录 一、接雨水方法一:按列求(动态规划)方法二:双指针方法三:单调栈 二、直方图最大矩形面积单调栈哨兵位优化 三、矩阵中最大的矩形前缀和单调栈 一、接雨水 题目链接 题目描述: 给定 n 个非负整数…

JVM_垃圾回收器

目录 一、GC分类1.串行vs并行2.并发式vs独占式3.压缩式vs非压缩式4.年轻代vs老年代 二、GC评估指标1.吞吐量2.暂停时间3.小结 三、垃圾回收器都有哪些?1.GC发展史2.7种GC组合关系?3.为什么这么多GC4.如何查看默认GC?5.Serial GC:串行回收5.1…

字符设备驱动开发实验

我们以 chadev 这个虚拟设备为 例,完整的编写一个字符设备驱动模块。chadev 不是实际存在的一个设备,是为了方 便讲解字符设备的开发而引入的一个虚拟设备设备有两个缓冲区,一个为读缓冲 区,一个为写缓冲区,这两个缓冲…

Spring事务隔离级别详解

Spring有五大隔离级别: 1、ISOLATION_DEFAULT 2、ISOLATION_READ_UNCOMMITTED 3、ISOLATION_READ_COMMITTED 4、ISOLATION_REPEATABLE_READ 5、ISOLATION_SERIALIZABLE ISOLATION_DEFAULT 用底层数据库的设置隔离级别。 ISOLATION_READ_UNCOMMITTED 一个事…

java 数组创建的方法

数组是一个由一组元素组成的集合,我们可以用一个数组来表示集合。 java中最基本的数据类型是字符串,其长度是固定的,且不可变,一个字符串只能以一个数字开头。 在 Java中我们可以通过 myConst关键字来指定数组的长度。下面就看一下…

直线飙升到10万+star的AutoGpt,有多强?帮我写了个网页!

先来感受一下10万的star,到底有多强! 从4月2日开始,直线飙升到10万star Auto-GPT是一个实验性的开源应用程序,展示了GPT-4语言模型的功能。这个程序由GPT-4驱动,将LLM“思想”链接在一起,以自主实现您设定的…

CTO解读:从“RSAC 2023”到“韧性数据安全”—Stronger Together

一年一度RSA Conference已落下帷幕。作为全球最具规模的安全大会,每年一届的RSAC都是安全行业的风向标。 2023年RSAC的主题是:Stronger Together,一起更强大。安全产品往往是场景化的,单点产品解决不同的问题,有机的整…

QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样

QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样 [1] QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样一、本自制虚拟键盘特点二、windows打开系统自带软键盘三、让键盘界面保持在最上方、不改变底层界面焦点四、长按按键重复输入键盘内容五、模拟键盘点击事件完成虚拟键盘…

虹科方案|使用 HK-TRUENAS支持媒体和娱乐工作流程-2

一、支持 M&E 工作流程的HK-TRUENAS 屡获殊荣的 TrueNAS 存储解决方案支持单独的工作空间来存放可在现场或制作室访问的媒体资产。 TrueNAS 提供企业功能,支持多个物理和虚拟应用程序,并具有同步块和文件存储访问。 这些功能允许备份和重新利用视频、…

路由递归配置

路由递归原理 路由必须有直连的下一跳才能够指导转发,但是路由生成时下一跳可能不是直连的,因此需要计算出一个直连的下一跳和对应的出接口,这个过程就叫做路由递归 。 路由递归也被称为路由 迭代。 实验配置 路由器R1配置 interface GigabitEthernet0/0/0ip address 192.…

《编程思维与实践》1049.GPS数据处理

《编程思维与实践》1049.GPS数据处理 题目 思路 注记: UTC为世界标准时间(0时区),东区加,西区减. 分两步实现: 1.判断是否为有效的语句: 有效需要满足三个条件: ①语句含$GPRMC,可以通过strstr搜索来判断; ②状态已定位,可以用sscanf来读取判断; ③异或结果与校验值相同,校验值…

【Vue学习笔记6】好用的 Vueuse 工具包

1. 安装Vueuse VueUse 的官方(https://vueuse.org/)的介绍说这是一个 Composition API 的工具集合,适用于 Vue 2.x 或者 Vue 3.x,用起来和 React Hooks 还挺像的。 VueUse 插件的安装 npm install vueuse/core2. 实现全屏功能 …

【三十天精通Vue 3】第二十七天 Vue 3的实战案例-接口进度条

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、安装进度条插件1.1 安装NProgress插件1.2 在Vue3中引入NProgress插件二、在路由中使用进度条2.1 在全局路由中使用进度…

ubuntu20.04安装搜狗输入法

搜狗输入法下载网址: https://shurufa.sogou.com/linux 选择x86_64版本 打开 系统设置——区域和语言——管理已安装的语言——在“语言”tab下——点击“添加或删除语言” 弹出“已安装语言”窗口,勾选中文(简体),点…

【RPC、WebSocket】

文章目录 有HTTP协议为什么还要RPCTCPHTTP 和 RPCHTTP 和 RPC 有什么区别 有HTTP协议为什么还要WebSocket使用HTTP不断轮询长轮询WebSocket怎么建立WebSocket连接 有HTTP协议为什么还要RPC TCP TCP三个特点:面向连接、可靠、基于字节流。 基于字节流 字节流可以理…

Disabled PicPipeline: ImagesPipeline requires installing Pillow 4.0.0 or later

目录 一、scrapy是什么 二、问题以及原因 三、解决办法 1、确保系统已经安装了 Pillow 库。 2、安装 Pillow 库。 3、在项目根目录中添加 Pillow 的 .pth 文件。 一、scrapy是什么 Scrapy是一个用于从网站和Web应用中抓取数据的强大的Python库。Scrapy支持异步I/O和 Scr…

销售数据分析怎么做?这篇文章说清楚了

如何分析销售数据?分析销售数据有哪些指标?销售数据分析有什么作用? 销售数据是不是得通过数据分析软件啊? 本文将为您解答疑惑—— 一、分析销售数据的指标 从两个层面上来讲,一个是对销售情况的整体把控&#xf…

大学校友会管理APP系统开发 重温同学梦再叙校园情

互联网技术的深入发展,让各行各业对网络的依赖都逐渐加深,可以说网络在今天已经成为无数个你我他不可或缺的平台。学生时代是一生中最美好的时期,校友是社会高效重要的社会资本和无形资产,校友与校友之间信息交流也需要依靠互联网…

虚拟化转向容器的新方案,红帽正式推出虚拟化容器统一平台——openshift虚拟化

编辑 | 宋慧 出品 | CSDN 云计算 云原生、容器化,是近年 IT 界主要的话题之一。 数字化转型的浪潮下,技术在朝向更加有利于业务快速迭代的方向发展。据 CSDN 最新年度《中国开发者调查报告》数据显示,近一半的公司(43%&#xff0…