鸿蒙进阶篇-Scroll、Tabs、Badge

“在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。”

各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今天的学习,鸿蒙进阶篇-Scroll、Tabs、Badge

在鸿蒙中:

Scroll(滚动):Scroll 通常用于实现内容超出屏幕显示范围时的滚动效果,以便用户能够查看更多的信息。通过滚动视图组件,用户可以上下或左右滑动屏幕来浏览被隐藏的部分内容。

Tabs(标签页):Tabs 是一种常见的界面导航方式,将不同的内容或功能划分到不同的标签页中,用户可以通过点击标签页轻松切换和查看相关的内容或执行对应的操作。

Badge(徽章):Badge 一般用于在图标或组件上显示一些提示信息,如未读消息的数量、新通知的标志等,以引起用户的注意并提供快速的状态提示。

这些组件和概念有助于提升鸿蒙应用的用户体验和交互性,使界面更加清晰、易用和富有动态效果。

容器组件 Scroll

可滚动的容器组件,当子组件的布局尺寸超过Scroll的尺寸时,内容可以滚动。

当页面内容由多个区域组成,并且可以滚动时,下面附上参考文档链接: 

附上官方文档链接icon-default.png?t=O83Ahttps://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-scroll-V5#%E5%AD%90%E7%BB%84%E4%BB%B6

核心用法

先来看看 Scroll 的最核心用法,让内容滚动

核心用法:

  1. Scroll 设置尺寸
  2. 设置 子组件(只支持一个子组件)
  3. 设置滚动:   

                          ①竖向滚动:子组件的高度超出 Scroll         

                          ②横向滚动:子组件的宽度超出 Scroll,scrollable改为横向滚动 

     4. 根据需求调整属性   

Scroll(){// 只支持一个子组件Column(){// 内容放在内部// 尺寸超过 Scroll 即可滚动}
}
.width('100%')
.height(200)

scrollable

ScrollDirection

设置滚动方向。

ScrollDirection.Vertical 纵向

ScrollDirection.Horizontal 横向

scrollBar

BarState

设置滚动条状态。

scrollBarColor

string | number | Color

设置滚动条的颜色。

scrollBarWidth

string | number

设置滚动条的宽度

edgeEffect

value:EdgeEffect

设置边缘滑动效果。

EdgeEffect.None 无

EdgeEffect.Spring 弹簧

EdgeEffect.Fade 阴影

下面展示一个案例来理解:

@Entry
@Component
struct Page01_Scroll {build() {Column({ space: 10 }) {Text('竖向滚动').fontSize(20)// Scroll 容器尺寸固定// scrollable 设置横向// 内容横向超出 Scroll 即可Scroll() {// 设置内容Column() {}.height(1000).width('100%')// 线型渐变.linearGradient({colors: [['#0094ff', 0], [Color.Orange, 1]],})}.scrollBarColor(Color.Pink).scrollBarWidth(50).scrollBar(BarState.Off).edgeEffect(EdgeEffect.Spring).width('100%').height(200).border({ width: 1, color: Color.Orange })Divider()Text('横向滚动').fontSize(20)// Scroll 容器尺寸固定// scrollable 设置横向// 内容横向超出 Scroll 即可Scroll() {Row() {}.height('100%').width(1000).linearGradient({angle: 90,colors: [['#0094ff', 0], [Color.Orange, 1]],})}// 横向滚动.scrollable(ScrollDirection.Horizontal).width('100%').height(200).border({ width: 1, color: Color.Orange }).edgeEffect(EdgeEffect.Spring)}.width('100%').height('100%')}
}

Scroll 的控制器

日常开发中可能需要通过代码控制滚动,以及获取滚动的距离,比如下图:

这个时候就可以通过 Scroll 的控制器来实现

比如:

  1. 页面滚动超过一定距离,显示返回顶部(火箭),反之隐藏--获取滚动距离
  2. 点击返回顶部(火箭),返回顶部--代码控制滚动

核心步骤:

  1. 实例化 Scroller的 控制器
  2. 绑定给 Scroll
  3. 调用 控制器的方法 控制滚动 以及 获取滚动距离

下面代码供参考,具体加入参数可以自行实现: 

@Entry
@Component
struct Page03_Scroller {// 1. 创建 Scroller 控制器scroller: Scroller = new Scroller()build() {Column() {// 2. 设置给ScrollScroll(this.scroller) {// 内容略}}}
}

下面给出链接方法:

这里用到了 2 个方法:

  1. scrollEdge:滚动到边缘
  2. currentOffset返回当前的偏移量

scrollEdge方法

滚动到容器边缘,不区分滚动轴方向,Edge.Top和Edge.Start表现相同,Edge.Bottom和Edge.End表现相同。

this.scroller.scrollEdge(Edge.Top)
this.scroller.scrollEdge(Edge.Start)
this.scroller.scrollEdge(Edge.Bottom)
this.scroller.scrollEdge(Edge.End)

参数:

参数名

参数类型

必填

参数描述

value

Edge

滚动到的边缘位置。

Edge.Top 顶部

Edge.Start 开头

Edge.Bottom 底部

Edge.End 结尾

currentOffset 方法

作用:获取滚动距离

this.scroller.currentOffset().xOffset // x 轴滚动距离
this.scroller.currentOffset().yOffset // y 轴滚动距离

类型

描述

{

xOffset: number,

yOffset: number

}

xOffset: 水平滑动偏移;

yOffset: 竖直滑动偏移。

说明:

返回值单位为vp。

下面展示一个案例来理解:

import { promptAction } from '@kit.ArkUI'@Entry
@Component
struct Page03_Scroller {scroller: Scroller = new Scroller()build() {Column({ space: 10 }) {Text('竖向滚动').fontSize(20)Scroll(this.scroller) {// 设置内容Column() {}.height(1000).width('100%').linearGradient({colors: [['#0094ff', 0], [Color.Orange, 1]],})}.scrollBarColor(Color.Pink).scrollBarWidth(5).scrollBar(BarState.On).edgeEffect(EdgeEffect.Spring).width('100%').height(200).border({ width: 1, color: Color.Orange })//Row() {Button('滚动到顶部').onClick(() => {this.scroller.scrollEdge(Edge.Start)})Button('滚动到底部').onClick(() => {this.scroller.scrollEdge(Edge.Bottom)})Button('查看滚动距离').onClick(() => {const res = this.scroller.currentOffset()promptAction.showToast({ message: 'resX ----->' + res.xOffset, }) //轻提示w('resX -----> ', res.xOffset)promptAction.showToast({ message: 'resY ----->' + res.yOffset }) //轻提示w('resY -----> ', res.yOffset)// JSON.stringify()方法, 可以把一个对象转换为字符串, 方便数据观察promptAction.showToast({message: 'res -----> ' + JSON.stringify(res)}) //轻提示w('res -----> ', JSON.stringify(res))})}}.width('100%').height('100%')}
}

Scroll 事件

Scroll 组件提供了一些事件,让开发者可以在适当的时候添加逻辑

名称

功能描述

onScroll(event: (xOffset: number, yOffset: number) => void)

滚动事件回调, 返回滚动时水平、竖直方向偏移量。

触发该事件的条件 :

1、滚动组件触发滚动时触发,支持键鼠操作等其他触发滚动的输入设置。

2、通过滚动控制器API接口调用。

3、越界回弹。

........

更多事件参考文档,日常开发中,较为常用的是 onScroll

2. 容器组件Tabs

当页面内容较多时,可以通过Tabs组件进行分类展示,以下这些效果都可以通过Tabs组件来实现

附上官方文档链接icon-default.png?t=O83Ahttps://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-tabs-V5#%E5%AD%90%E7%BB%84%E4%BB%B6

基本用法

先来看看最基础的用法

@Entry
@Component
struct TabbarDemo {build() {Tabs() { // 顶级容器TabContent() {// 内容区域:只能有一个子组件}.tabBar('首页') // 导航栏}}
}

下面展示一个案例来理解:

@Entry
@Component
struct Page06_Tabs {build() {Tabs() {// 内容TabContent() {Text('首页的内容').fontSize(30)}// tabBar.tabBar('首页')TabContent() {Text('推荐的内容').fontSize(30)}.tabBar('推荐')TabContent() {Text('发现的内容').fontSize(30)}.tabBar('发现')TabContent() {Text('我的内容').fontSize(30)}.tabBar("我的")}}
}

常用属性

默认的 tabs 已经可以实现切换,接下来咱们来看看如何通过属性控制他

  1. 垂直导航
  2. 导航位置
  3. 禁用滑动切换

通过 Tabs 的属性进行调整:

  • vertical 属性即可调整导航为 水平 或 垂直
  • barPosition 即可调整导航位置为 开头 或 结尾
  • scrollable 即可调整是否允许 滑动切换
  • animationDuration 设置动画时间 毫秒

下面展示一个案例来理解:

@Entry
@Component
struct Page07_TabsAttribute {build() {Tabs() {// 内容TabContent() {Text('首页的内容').fontSize(30)}// tabBar.tabBar('首页')TabContent() {Text('推荐的内容').fontSize(30)}.tabBar('推荐')TabContent() {Text('发现的内容').fontSize(30)}.tabBar('发现')TabContent() {Text('我的内容').fontSize(30)}.tabBar("我的")}.barPosition(BarPosition.End) // 位置.vertical(true) // 纵向.scrollable(false) // 滑动切换.animationDuration(4000) // 动画持续时间}
}

滚动导航栏

如果导航栏的内容较多,屏幕无法容纳时,可以将他设置为滚动

可以通过 Tabs 组件的 barMode 属性即可调整 固定导航栏 或 滚动导航栏

Tabs(){// 内容略
}.barMode(BarMode.Scrollable)// 滚动// .barMode(BarMode.Fixed)// 默认值

下面展示一个案例来理解:

@Entry
@Component
struct Page08_TabsScrollable {titles: string [] = ['首页', '关注', '热门', '军事', '体育', '八卦', '数码', '财经', '美食', '旅行']build() {// 外层容器Tabs() {// 内容ForEach(this.titles, (title: string, index: number) => {TabContent() {Text(title + '的内容').fontSize(30)}.tabBar(title)})}.barMode(BarMode.Scrollable)}
}

自定义tabBar

TabBar 如果放在底部的话,一般会显示图形文字,甚至有特殊的图标,如果要实现此类效果,就需要 自定义tabBar

tabBar

string | CustomBuilder

设置TabBar上显示内容。

CustomBuilder: 构造器,内部可以传入组件

Tabs() {TabContent() {// 内容略}.tabBar(this.tabBarBuilder())}@Builder
tabBarBuilder() {// 自定义的Tabbar结构
}

自定义 tabBar-Tabs组件的事件

自定义TabBar 之后,高亮的切换效果就没有了,需要自行实现,咱们分两步走:

  1. 明确什么时候 tab 进行了切换
  2. 更改高亮效果

名称

功能描述

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

Tab页签切换后触发的事件。

- index:当前显示的index索引,索引从0开始计算。

滑动切换、点击切换 均会触发

onTabBarClick(event: (index: number) => void)10+

Tab页签点击后触发的事件。

- index:被点击的index索引,索引从0开始计算。

容器组件Badge

可以附加在单个组件上用于信息标记的容器组件,在应用开发中较为常见,比如:

附上官方文档链接icon-default.png?t=O83Ahttps://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-badge.md

核心用法

Badge是 容器组件,只支持单个子元素

  Badge({count:0,style:{}}){// 单个子元素}

参数名

参数类型

必填

参数描述

count

number

设置提醒消息数。
说明:
小于等于0时不显示信息标记。

position

BadgePosition|Position10+

设置提示点显示位置。
默认值:BadgePosition.RightTop

maxCount

number

最大消息数,超过最大消息时仅显示maxCount+。
默认值:99
取值范围

style

BadgeStyle

Badge组件可设置样式,支持设置文本颜色、尺寸、圆点颜色和尺寸。

下面展示一个案例来理解:

@Entry
@Component
struct Page14_Badge {build() {Column() {Text('Badge 组件').fontSize(50).fontWeight(FontWeight.Bold)// 基本用法Badge({ count: 10, style: {} }) {Text('信息').border({ width: .5, }).borderRadius(10).padding(10)}// 调整位置Badge({ count: 10, position: BadgePosition.Left, style: {} }) {Text('信息').border({ width: .5, }).borderRadius(10).padding(10)}// 3. 最大个数Badge({count: 12,maxCount: 10,position: BadgePosition.Right,style: {}}) {Text('感觉自己萌萌哒').border({ width: .5, }).borderRadius(10).padding(10)}// 4. 调整样式Badge({count: 12, style: {fontSize: 20,color: Color.Orange,badgeColor: Color.Black,borderColor: Color.Black,badgeSize: 30}}) {Text('感觉自己萌萌哒').border({ width: .5, }).borderRadius(10).padding(10)}}.width('100%').height('100%')}
}

以上是关于鸿蒙进阶篇-Scroll、Tabs、Badge 综合的一些内容,方便大家学习,至此,关于鸿蒙进阶篇-Scroll、Tabs、Badge 综合的内容就介绍到这里,愿您能学以致用,开发出精彩的鸿蒙应用!

以上内容仅供学习交流,如有违法或者侵权可以联系删除。

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

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

相关文章

多厂商的实现不同vlan间通信

Cisco单臂路由 Cisco路由器配置 -交换机配置 -pc配置 华三的单臂路由 -路由器配置 -华三的接口默认是打开的 -pc配置及ping的结果 -注意不要忘记配置默认网关 Cisco-SVI -交换机的配置 -创建vlan -> 设置物理接口对应的Acess或Trunk -> 进入vlan接口,打开接…

Golang--函数、包、defer、系统函数、内置函数

1、何为函数 函数作用:提高代码的复用型,减少代码的冗余,提高代码的维护性 函数定义:为完成某一功能的程序指令(语句)的集合,称为函数。 语法: func 函数名(形参列表)(返回值类型列表){ //执行语句 //…… return …

2024/11/3周报

文章目录 摘要AbstractA2/O反应原理与详细流程一、反应原理二、工艺流程三、反应控制与优化模拟数据 文献阅读标题研究背景与重要性模型构建与方法论模型各部分的功能 数据收集与预处理模型训练与实验实验结果与分析模型的创新与贡献实际应用价值与未来发展方向结论 摘要 本周…

一文搞定分治算法

分治 基础入门 搜索策略 基于分治实现二分查找 构建二叉树问题 汉诺塔问题 相关题解: leetcode226.翻转二叉树 法一:递归 leetcode101.对称二叉树 法一:递归 法二:迭代 leetcode50. Pow(x, n) 法一:快速幂…

angular使用http实现get和post请求

说明: angular使用http实现get和post请求 提示:在运行本项目前,请先导入路由router,可以参考我上一篇文章。 效果图: step1:E:\projectgood\ajsix\untitled4\package.json “angular/cdk”: “^18.2.10”, “angula…

SQL,力扣题目1285,找到连续区间的开始和结束数字【窗口函数】

一、力扣链接 LeetCode_1285 二、题目描述 表:Logs ------------------------ | Column Name | Type | ------------------------ | log_id | int | ------------------------ id 是上表具有唯一值的列。 上表的每一行包含日志表中的一个 ID。编…

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-linux)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

访问控制技术原理与应用

目录 访问控制概述实现访问控制目标访问控制参考模型常见访问控制模型访问控制模型-DAC自主访问控制访问控制模型-MAC强制访问控制访问控制模型-RBAC基于角色的访问控制访问控制模型-ABAC基于属性的访问控制 访问控制概述 访问控制是对资源对象的访问授权控制的方法以及运行机…

分数阶傅里叶变换与信息熵怎么用于信号处理?

天马行空的理解与思考方式:分数阶傅里叶变换与信息熵怎么用于信号处理? ChiX-Y 快速学习,快速尝试,快速失败 已关注 35 人赞同了该文章 这篇文章希望能写的有趣,同时有质量,学习就是要多维度多角度&…

QT——TCP网络调试助手

目录 一.项目展示 ​编辑 二.开发流程 三.QTcpServer、QTcpSocket、QUdpSocket类的学习 1.QTcpServer服务端 2.QTcpSocket客户端 3.Udp通信 四.网络调试助手 1.首先我们实现当用户选择不同协议类型时不同的UI组件如何切换 2.实现打开/关闭按键图片的切换 方式一&…

怎么压缩pdf文件大小?关于压缩PDF文件大小的几种压缩方法

怎么压缩pdf文件大小?压缩PDF文件能够显著减小文件体积,从而节省硬盘和云存储空间,这对于管理大量文档尤其重要。较小的文件大小使得通过电子邮件或在线平台发送变得更加迅速,缩短了传输时间。同时,压缩后的文件更方便…

使用Scrapy框架爬取博客信息

随着网络的发展,越来越多有价值的信息存储在网络上。使用爬虫技术可以从这些信息源中提取出有用的数据。本文将介绍如何使用Python中的Scrapy框架来爬取博客站点上的文章标题、作者以及阅读数,并将其保存到JSON文件中。 一、项目背景 Scrapy是一个快速…

网络编程 UDP编程 Linux环境 C语言实现

UDP编程 1. 一般UDP编程 UDP传输特点:非面向连接、不可靠的、无序的 报式传输 支持组播和广播 UDP应用数据最大长度建议:MTU(以太网分组数据的最大长度)1500 - 20(IP头) - 8(UDP头) 1472Bytes 客户端:支持两种形式的代码编写: 1. 不定向…

使用linux+nginx 作为unity webgl的服务器

使用linuxnginx 作为unity webgl的服务器 建议使用命令行下载,使用源码编译可能编译不过。 自己创建一个uinty webgl项目,或者下载我上传的unity webgl项目 https://download.csdn.net/download/GoodCooking/24339451下载nginx 使用图形界面 下载ngi…

Flink CDC 同步 Mysql 数据

文章目录 一、Flink CDC、Flink、CDC各有啥关系1.1 概述1.2 和 jdbc Connectors 对比 二、使用2.1 Mysql 打开 bin-log 功能2.2 在 Mysql 中建库建表准备2.3 遇到的坑2.4 测试 三、番外 一、Flink CDC、Flink、CDC各有啥关系 Flink:流式计算框架,不包含 …

【模型学习之路】手写+分析bert

手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前,建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…

C#实现隐藏和显示任务栏

实现步骤 为了能够控制Windows任务栏,我们需要利用Windows API提供的功能。具体来说,我们会使用到user32.dll中的两个函数:FindWindow和ShowWindow。这两个函数可以帮助我们找到任务栏窗口,并对其执行显示或隐藏的操作 引入命名空…

Excel菜单选项无法点击?两种原因及解决方法全解析

在使用Excel处理数据时,有时会遇到菜单选项无法点击的情况。这种问题会影响到正常的操作和编辑。出现这种情况的原因可能有多种,本文将介绍两种常见的原因,并提供相应的解决方法,帮助小伙伴们快速恢复菜单选项的正常使用。 原因一…

SpringBoot节奏:Web音乐网站构建手册

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

波尼音乐 2.3.0-b1 | 开源免费的音乐播放器,附两个公共接口

波尼音乐最初作为一个毕设项目,凭借其实现了本地与网络音乐播放的能力而受到许多用户的喜爱。随着百度在线音乐API的关闭,波尼音乐逐渐失去在线音乐播放功能。在开源社区的支持下,开发者发现新的网易云音乐API,重启项目并进行全面…