鸿蒙界面开发(12):选项卡布局(Tabs)

news2024/11/13 12:17:38

选项卡布局(Tabs)

当页面信息较多时,为了让用户能够聚焦于当前显示的内容,需要对页面内容进行分类,提高页面空间利用率。Tabs组件可以在一个页面内快速实现视图内容的切换。

基本布局

Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏。
在这里插入图片描述
说明
TabContent组件不支持设置通用宽度属性,其宽度默认撑满Tabs父组件。

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

Tabs(){
 TabContent() {
   Text('首页的内容').fontSize(30)
 }
.tabBar('首页')
...
 TabContent() {
   Text('...').fontSize(30)
 }
.tabBar('...')
}
...

导航栏位置使用Tabs的barPosition参数进行设置。默认情况下,导航栏位于顶部,此时,barPosition为BarPosition.Start。设置为底部导航时,需要将barPosition设置为BarPosition.End。

Tabs({ barPosition: BarPosition.End }) {
  // TabContent的内容:首页、发现、推荐、我的
  ...
}

实现侧边导航栏需要将Tabs的vertical属性设置为true,vertical默认值为false,表明内容页和导航栏垂直方向排列。

Tabs({ barPosition: BarPosition.Start }) {
  // TabContent的内容:首页、发现、推荐、我的
  ...
}
.vertical(true)
.barWidth(100)
.barHeight(200)

说明
vertical为false时,tabbar的宽度默认为撑满屏幕的宽度,需要设置barWidth为合适值。
vertical为true时,tabbar的高度默认为实际内容的高度,需要设置barHeight为合适值。

限制导航栏的滑动切换

默认情况下,导航栏都支持滑动切换,在一些内容信息量需要进行多级分类的页面,如支持底部导航+顶部导航组合的情况下,底部导航栏的滑动效果与顶部导航出现冲突,此时需要限制底部导航的滑动,避免引起不好的用户体验。

控制手动滑动切换的属性为scrollable,默认值为true,表示可以滑动,若要限制滑动切换页签则需要设置为false。

Tabs({ barPosition: BarPosition.End }) {
  // 其他TabContent内容:发现、推荐、我的
  ...
}
.scrollable(false)

滑动动画animationDuration

.animationDuration():点击滑动的动画时间,不想要动画,可以设为0

导航栏

固定导航栏——BarMode.Fixed

当内容分类较为固定且不具有拓展性时,例如底部导航内容分类一般固定,分类数量一般在3-5个,此时使用固定导航栏。固定导航栏不可滚动,无法被拖拽滚动,内容均分tabBar的宽度。
Tabs的barMode属性用于控制导航栏是否可以滚动,默认值为BarMode.Fixed。

Tabs({ barPosition: BarPosition.End }) {
  // TabContent的内容:首页、发现、推荐、我的
  ...
}
.barMode(BarMode.Fixed)

滚动导航栏BarMode.Scrollable

滚动导航栏可以用于顶部导航栏或者侧边导航栏的设置,内容分类较多,屏幕宽度无法容纳所有分类页签的情况下,需要使用可滚动的导航栏,支持用户点击和滑动来加载隐藏的页签内容。
滚动导航栏需要设置Tabs组件的barMode属性,BarMode.Scrollable表示可滚动导航栏。

Tabs({ barPosition: BarPosition.Start }) {
  // TabContent的内容:关注、视频、游戏、数码、科技、体育、影视、人文、艺术、自然、军事
  ...
}
.barMode(BarMode.Scrollable)

自定义导航栏

对于底部导航栏,一般作为应用主页面功能区分,为了更好的用户体验,会组合文字以及对应语义图标表示页签内容,这种情况下,需要自定义导航页签的样式
设置自定义导航栏需要使用tabBar的参数,以其支持的CustomBuilder的方式传入自定义的函数组件样式。

例如这里声明tabBuilder的自定义函数组件,传入参数包括页签文字title,对应位置index,以及选中状态和未选中状态的图片资源。通过当前活跃的currentIndex和页签对应的targetIndex匹配与否,决定UI显示的样式。
//参数
@Builder tabBuilder(title: string, 
		targetIndex: number, 
		selectedImg: Resource, 
		normalImg: Resource
) {//结构
  Column() {//融侨城
    Image(this.currentIndex === targetIndex ? selectedImg : normalImg)
      .size({ width: 25, height: 25 })
    Text(title)
      .fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
  }
  .width('100%')
  .height(50)
  .justifyContent(FlexAlign.Center)
}

在TabContent对应tabBar属性中传入自定义函数组件,并传递相应的参数。
TabContent() {。。。}
.tabBar(this.tabBuilder('我的', 0, $r('app.media.mine_selected'), $r('app.media.mine_normal')))

切换至指定页签

在不使用自定义导航栏时,默认的Tabs会实现切换逻辑。在使用了自定义导航栏后,默认的Tabs仅实现滑动内容页和点击页签时内容页的切换逻辑,页签切换逻辑需要自行实现。即用户滑动内容页和点击页签时,页签栏需要同步切换至内容页对应的页签
此时需要使用Tabs提供的onChange事件方法,监听索引index的变化,并将当前活跃的index值传递给currentIndex,实现页签的切换。

@Entry
@Component
struct TabsExample1 {
  @State currentIndex: number = 0
  @Builder tabBuilder(title: string, targetIndex: number) {
    Column() {
    //判断是否为当前内容页,改变页签的颜色
      Text(title) .fontColor(this.currentIndex === targetIndex ? '#1698CE' : '#6B6B6B')
    }
  }

  build() {
    Column() {
      Tabs({ barPosition: BarPosition.End }) {
        TabContent() {...}.tabBar(this.tabBuilder('首页', 0))
        ...
      }.animationDuration(0).backgroundColor('#F1F3F5')
      //onChange事件,监听滑动和点击的时候,都会触发
      .onChange((index: number) => {
        this.currentIndex = index
      })
    }.width('100%')
  }
}

在这里插入图片描述

2 除此之外,还可以将currentIndex传给Tabs的index参数,通过改变currentIndex来实现跳转至指定索引值对应的TabContent内容。
3 也可以使用TabsController,TabsController是Tabs组件的控制器,用于控制Tabs组件进行内容页切换。通过TabsController的changeIndex方法来实现跳转至指定索引值对应的TabContent内容。

@State currentIndex: number = 2
private controller: TabsController = new TabsController()

Tabs({ barPosition: BarPosition.End, index: this.currentIndex, controller: this.controller }) {...}.height(600)
.onChange((index: number) => {
   this.currentIndex = index
})

Button('动态修改index').width('50%').margin({ top: 20 })
  .onClick(()=>{
    this.currentIndex = (this.currentIndex + 1) % 4
})

Button('changeIndex').width('50%').margin({ top: 20 })
  .onClick(()=>{
    let index = (this.currentIndex + 1) % 4
    this.controller.changeIndex(index)
})

4 还可以通过Tabs组件的onContentWillChange接口,设置自定义拦截回调函数。拦截回调函数在下一个页面即将展示时被调用,如果回调返回true,新页面可以展示;如果回调返回false,新页面不会展示,仍显示原来页面。

Tabs({ barPosition: BarPosition.End, controller: this.controller, index: this.currentIndex }) {...}
.onContentWillChange((currentIndex, comingIndex) => {
  if (comingIndex == 2) {
    return false
  }
  return true
})

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

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

相关文章

数据结构(邓俊辉)学习笔记】串 17——Karp-Rabin算法:散列

文章目录 1.数位溢出2.散列压缩3.应对冲突4.指纹更新 1.数位溢出 在前一节中,已经成功地完成了一次视角转换,了解到应该如何从数学上将每一个串视作为一个自然数。以下我们就来将这一构思具体的兑现为一个算法。很有意思的是,我们在此需要用到…

qt4.8.7编译中出现const void* 禁止转换为void *

编译错误 错误忘截图&#xff0c;大概是如下头文件的问题&#xff1a; 该文件中的这一段函数报了如图所示的错误&#xff1a; // Test and set for pointerstemplate <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expecte…

Tensor常见操作、自动微分及手动构建模型

有关张量&#xff08;Tensor&#xff09;的创建、常见属性及数据转换 见此链接https://blog.csdn.net/m0_68153457/article/details/141686846?spm1001.2014.3001.5501 一、Tensor常见操作 1.tensor相关运算 在进行相关运算前&#xff0c;我们要学会获取元素的值&#xff0…

使用本地IP无法访问前端项目的问题

说明&#xff1a;记录一次使用本机IP无法访问前端项目的问题 场景&解决 前端项目在我本机电脑上部署完成&#xff0c;我想通过局域网的IP把地址发给测试&#xff0c;发现使用localhost和127.0.0.0都能访问到前端项目&#xff0c;但是这个地址只能在自己的电脑上访问。 解…

Java响应式编程

Java响应式编程是一种基于异步和非阻塞的编程范式&#xff0c;旨在处理现代应用中日益增长的高并发、海量数据以及低延迟需求。通过响应式编程&#xff0c;开发者能够以更加优雅和高效的方式编写能够应对这些挑战的应用程序。 Quick start import reactor.core.publisher.Flux…

认知杂谈44

今天分享 有人说的一段争议性的话 《耐心雕琢人生&#xff1a;终身学习&#xff0c;绘就多彩画卷》 嘿&#xff0c;咱都知道&#xff0c;老有人说二十一天就能养成个新习惯&#xff0c;听着好像挺容易挺快的哈。 I I 可实际上呢&#xff0c;靠这种速成法养出来的习惯&#xff…

uniapp生命周期函数

常见页面生命周期函数 onLoad(options): 页面加载时触发&#xff0c;可以接收启动页面时的参数 onShow: onReady: 页面初次渲染完成时触发。 onHide: 页面被隐藏时触发 onUnload: 页面被关闭时触发 onLoad作用 获取url传递的参数,可以使用onLoad来获取,具体实现可以查看 如何获…

MySQL进阶篇1

一、存储引擎 1.1 MySQL体系结构 1.2 存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。 1.3 存储引擎特点 1.4 存储引擎选择 存储引擎没有好坏之分&am…

Ubuntu22.04安装 docker和docker-compose环境

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;…

深度学习入门笔记

深度学习入门笔记 感知机逻辑与门与非门或门多层感知机异或门 神经网络激活函数输出层设计损失函数均方误差 MSE交叉熵误差 反向传播算法计算图局部计算计算图反向传播反向传播 参数更新训练过程总结 该篇文章为本人学习笔记的一部分。笔记基于《深度学习入门 基于python理论实…

Navicat连接Mongodb成功了,但是无法显示数据库怎么办?

不知道你是否遇到过&#xff1f;Navicat连接Mongodb成功了&#xff0c;但是无法显示数据库怎么办&#xff1f; 解决办法 这个问题比较坑&#xff0c;对于第一次接触的小伙伴&#xff0c;可能会一脸懵逼&#xff0c;原因就是在Navicat中默认会不显示隐藏的项目&#xff0c;如果不…

产品/运营经理的数据分析思维和学习路径

数据分析是产品经理和运营同学必知必会的技能之一&#xff0c;该技能会贯穿到产品经理和运营同学的整个职业生涯。 产品经理不需要成为数据分析方面的专家&#xff0c;但分析哪些数据、如何分析数据、如何用数据辅助决策、如何用数据驱动业务&#xff0c;这些是产品和运营同学…

C++学习笔记之指针(基础)

C学习笔记之指针&#xff08;基础&#xff09; https://www.runoob.com/cplusplus/cpp-pointers.html C/C中的指针内容是早就盛名在外了&#xff0c;当然了&#xff0c;想要随心所欲地使用也是要做很多功课的&#xff0c;先简单了解下吧~ 首先&#xff0c;我们需要了解一点内存…

STM32基础篇:RTC × Unix时间戳 × BKP

Unix时间戳 最早是在Unix系统使用的&#xff0c;之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前&#xff0c;Linux、Windows、安卓这些系统&#xff0c;其底层的计时系统都是使用Unix时间戳。 Uinx时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/…

论文速读|ReKep:空间时间理论的关系关键点约束,用于机器人操作

项目地址&#xff1a;ReKep | Spatio-Temporal ReasoningReKep | Spatio-Temporal Reasoning of Relational Keypoint Constraints for Robotic ManipulationReKep | Spatio-Temporal Reasoning ReKep&#xff08;Relational Keypoint Constraints&#xff09;是一种基于视觉的…

Nebula: 无服务器计算中的性能和能源效率 - WebAssembly与Docker的比较研究

这篇论文的标题是《Nebula: Performance and Energy Efficiency in Serverless Computing - A Comparative Study of WebAssembly and Docker》&#xff0c;作者是 Marius Nilsen Kluften&#xff0c;来自奥斯陆大学&#xff08;University of Oslo&#xff09;的信息学系。论文…

android仿assistivetouch悬浮窗实现(带功能实现)

一、悬浮窗点击后的界面&#xff1a; 主要有四个功能&#xff0c;返回、应用程序、退出和主界面。其他功能也可以类似添加。 界面布局代码就不贴出来了&#xff0c;源码&#xff08;切记需要签名才能让功能实现&#xff09;&#xff1a;下载地址 二、主要是检测系统启动或者a…

时序数据库荣登巅峰,被央视报道了!

8月30日&#xff0c;事务处理性能委员会TPC正式公布了最新的国际权威数据库性能基准榜单&#xff0c;“清华系”发起研制的Apache IoTDB开发的国产化时序数据库软件TimechoDB&#xff0c;在性能和系统成本维度上双双打破世界纪录。在央视《24小时》节目中&#xff0c;1分34秒重…

《黑神话:悟空》与游戏经济学的深度剖析

《黑神话&#xff1a;悟空》作为近年来备受瞩目的国产3A游戏大作&#xff0c;自其发布以来&#xff0c;不仅在游戏界内引起了轰动&#xff0c;更在多个消费领域产生了深远的影响。这款游戏不仅以其卓越的品质和深刻的文化内涵吸引了大量玩家的关注&#xff0c;还通过一系列连锁…

神策埋点 sensorsdata.es6.min.js、sensorsdata.min.js 触发eslint 语法检查,导致打包不成功

问题描述&#xff1a; 在使用神策埋点时&#xff0c;下载的web js sdk&#xff0c;打包时eslint 语法检查&#xff0c;会导致打包不成功。npm start没问题。 主要错误是&#xff1a; Line 1:204272: Expected an assignment or function call and instead saw an expression …