【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件
序言:
本文详细讲解了关于我们在页面上经常看到的可滚动页面和导航栏在鸿蒙开发中如何用Scroll和Tabs组件实现,介绍了Scroll和Tabs的基本用法与属性。
笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正。
B站黑马的课程链接:鸿蒙课程介绍_哔哩哔哩_bilibili
往期笔记:
【01】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs基础语法与界面开发基础
【02】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-界面进阶与布局排布(附QQ登陆、得物、京东登陆综合案例+代码)
【03】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-更多布局(弹性/层叠)方式与界面开发综合(附飞狗卡片+B站卡片案例+实战开发支付宝界面+代码)
【04】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs进阶运算符+状态管理(附综合案例美团购物车)
【05】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-条件渲染+if/switch判断与for/while循环(附计数器、京东加购案例)
【06】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-综合案例·生肖抽奖卡具体实现(类似支付宝集五福)
【07】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Swiper轮播组件与样式&结构重用
目录
一.滚动容器Scroll
1.Scroll-核心用法
2.Scroll-常见属性
3.Scroll-控制器
4.Scroll-事件
5.Scroll-京东案例
二.Tabs组件
1.Tabs-基本使用
2.Tabs-自定义TabBar-基础结构
3.Tabs-自定义TabBar-高亮切换
一.滚动容器Scroll
简介:当子组件的布局尺寸超出Scroll的尺寸时,内容可以滚动
1.Scroll-核心用法
1)用法说明:
①Scroll设置尺寸
②设置溢出的子组件(只支持一个子组件)
③滚动方向(支持横向和纵向,默认纵向)
2)代码示意:
build() {Scroll(){//只支持一个子组件Column(){//内容放在内部//尺寸超过Scroll即可滚动}}.width('100%').height(200).scrollable(ScrollDirection.xxx)//设置滚动方向}
//.scrollable(ScrollDirection.Vertical) 纵向
//.scrollable(ScrollDirection.Horizontal)横向
2.Scroll-常见属性
1)常用参数:
名称 | 参数类型 | 描述 |
scrollBar | BarState | 设置滚动条状态 |
scrollBarColor | string|number|Color | 设置滚动条颜色 |
scrollBarWidth | string|number | 设置滚动条宽度 |
edgeEffect | value:EdgeEffect | 设置边缘滑动效果 EdgeEffect.None 无 EdgeEffect.Spring 弹簧 EdgeEffect.Fade 阴影 |
scrollable | ScrollDirection | 设置滚动方向 ScrollDirection.Vertical) 纵向 ScrollDirection.Horizontal)横向 |
2)代码示意:
build() {Column() {Scroll() {Column() {ForEach(Array.from({ length: 10 }), (item: string, index) => {Text('测试文本').width('100%').height(100).backgroundColor(Color.Grey).margin(20)})}.padding(10).width('100%')}.width('100%').height(400).scrollable(ScrollDirection.Vertical) //设置滚动方向.scrollBar(BarState.On) //On令滚动条恒存在 Off恒隐藏 Auto滑动显示.scrollBarColor(Color.Blue) //滚动条颜色.scrollBarWidth(5) //滚动条宽度.edgeEffect(EdgeEffect.Spring) //滚动条弹簧效果}}
3.Scroll-控制器
1)核心步骤:
①实例化Scroll的控制器
②绑定给Scroll组件
③控制器的方法控制滚动,控制其属性获取滚动距离
2)代码示意:
struct Index {//1.创建Scroller对象(实例化)myscroller:Scroller = new Scroller()build() {Column({ space: 10 }) {Scroll(this.myscroller) {Column() {ForEach(Array.from({ length: 10 }), (irem: string, index) => {Text('测试文本').width('100%').height(100).backgroundColor(Color.Grey).margin(20)})}.padding(10).width('100%')}.width('100%').height(400).scrollable(ScrollDirection.Vertical) //设置滚动方向.scrollBar(BarState.On) //On令滚动条恒存在 Off恒隐藏 Auto滑动显示.scrollBarColor(Color.Blue) //滚动条颜色.scrollBarWidth(5) //滚动条宽度.edgeEffect(EdgeEffect.Spring) //滚动条弹簧效果Button('控制滚动条位置').margin(20).onClick(()=>{this.myscroller.scrollEdge(Edge.Top) //控制滚动条到顶部})Button('获取已经滚动的距离').onClick(()=>{const y = this.myscroller.currentOffset().yOffsetAlertDialog.show({message:`'y':${y}`})})}}
}
4.Scroll-事件
简介:Scroll组件提供了一些事件,让开发者可以在适当的时候添加逻辑。
Scroll(){//内容略}.onScroll((x,y))=>{//滚动时 一直触发//可以结合 scroller的currentOffset方案,获取滚动距离}
1)代码示意:
Scroll(this.myscroller) {Column() {ForEach(Array.from({ length: 10 }), (irem: string, index) => {Text('测试文本').width('100%').height(100).backgroundColor(Color.Grey).margin(20)})}.padding(10).width('100%')}.width('100%').height(400).scrollable(ScrollDirection.Vertical) //设置滚动方向.scrollBar(BarState.On) //On令滚动条恒存在 Off恒隐藏 Auto滑动显示.scrollBarColor(Color.Blue) //滚动条颜色.scrollBarWidth(5) //滚动条宽度.edgeEffect(EdgeEffect.Spring) //滚动条弹簧效果.onScroll((x,y)=>{console.log('已经滑动的距离:',this.myscroller.currentOffset().yOffset)})
5.Scroll-京东案例
1)代码示意:
@Entry
@Component
struct Index {//1.创建Scroll实例对象myscroller:Scroller = new Scroller()@State yOffset:number = 0 //实时保存y轴距离build() {Column() {Stack({ alignContent: Alignment.BottomEnd }) {// 顶部滚动区域//2.和scroller容器绑定Scroll(this.myscroller) {Column() {Image($r('app.media.ic_jd_scroll_01'))Image($r('app.media.ic_jd_scroll_02'))Image($r('app.media.ic_jd_scroll_03'))}}.scrollBar(BarState.Off).width('100%').backgroundColor(Color.Orange).onScroll(()=>{this.yOffset=this.myscroller.currentOffset().yOffset})//有时显示有时隐藏可以用条件渲染if(this.yOffset>400)Image($r('app.media.ic_jd_rocket')).width(40).backgroundColor(Color.White).borderRadius(20).padding(5)// .margin({right:20,bottom:20}).offset({ x: -20, y: -20 }).onClick(()=>{this.myscroller.scrollEdge(Edge.Top)})}.layoutWeight(1)// 底部 tabbar 图片(后面会学)Image($r('app.media.ic_jd_tab')).width('100%')}}
}
二.Tabs组件
当页面内容较多时,可以通过Tabs组件进行分类展示
Tab里面还可以有Tab
1.Tabs-基本使用
1)基本用法:
Tabs(){TabContent(){Text('首页内容') //有且只能有一个子组件,如果内容比较复杂,可以用Column这种}.tabBar('首页') //配置导航TabContent(){Text('推荐内容') //有且只能有一个子组件,如果内容比较复杂,可以用Column这种}.tabBar('推荐') //配置导航TabContent(){Text('发现内容') //有且只能有一个子组件,如果内容比较复杂,可以用Column这种}.tabBar('发现') //配置导航TabContent(){Text('我的') //有且只能有一个子组件,如果内容比较复杂,可以用Column这种}.tabBar('我的') //配置导航}
2)常用属性
名称 | 作用 |
barPosition | 调整位置 开头 或 结尾 参数 |
vertical | 调整导航 水平 或 垂直 |
scrollable | 调整是否手势滑动 切换 |
animationDuration | 点击滑动动画时间 |
①写法位置
3)滚动导航栏
如果导航栏的内容较多,屏幕无法容纳时,可以将它设置为滚动
可以通过Tabs组件的barMode属性即可调整固定导航栏或滚动导航栏
①代码示意:
tieles:string[]=['首页','关注','热门','军事','体育','八卦','数码','财经','美食','旅行',]//生成十个面板+十个小导航Tabs(){ForEach(this.tieles,(item:string,index)=>{TabContent(){Text('我是内容')}.tabBar(`${item}内容`)})}.barMode(BarMode.Scrollable)
2.Tabs-自定义TabBar-基础结构
TabBar在底部,一般会显示图形和文字,甚至有一些特殊logo
1)代码示意:
@Entry
@Component
struct Index {@BuildermyBuilder(title:string,img:ResourceStr){Column(){Image(img).width(30)Text(title)}}build() {Tabs({barPosition:BarPosition.End}){TabContent(){Text('购物车内容')}.tabBar(this.myBuilder('购物车',$r('app.media.ic_tabbar_icon_2')))TabContent(){Text('我的内容')}.tabBar(this.myBuilder('我的',$r('app.media.ic_tabbar_icon_3')))}}
}
3.Tabs-自定义TabBar-高亮切换
1)核心思路:
①监听切换事件→得到索引值,记录高亮的索引
②给每个tabber起一个标记,0,1,2
③在taber内部比较标记==记录的索引?高亮:不高亮
名称 | 功能描述 |
onChange(event:(index:number)=>void) | Tab页签切换后触发的事件。 -index:当前显示的index索引,索引从0开始计算。 滑动切换、点击切换 均会触发 |
onTabbarClick(event:(index:number)=>void)10+ | Tab页签点击后触发的事件。 -index:被点击的index索引,索引从0开始计算。 |
2)代码示意:
@Entry
@Component
struct Index {//准备状态,存储激活的索引@State selectIndex:number=0@BuildermyBuilder(itemIndex:number,title:string,img:ResourceStr,selImg:ResourceStr){//如果激活的是自己,图文/文本,都需要调整样式->需要区分不同的 tabarColumn(){Image(itemIndex==this.selectIndex?selImg:img).width(30)Text(title).fontColor(itemIndex==this.selectIndex?Color.Red:Color.Black)}}build() {Tabs({barPosition:BarPosition.End}){TabContent(){Text('购物车内容')}.tabBar(this.myBuilder(0,'购物车',$r('app.media.ic_tabbar_icon_2'),$r('app.media.ic_tabbar_icon_2_selected')))TabContent(){Text('我的内容')}.tabBar(this.myBuilder(1,'我的',$r('app.media.ic_tabbar_icon_3'),$r('app.media.ic_tabbar_icon_3_selected')))}.onChange((index:number)=>{/*console.log('激活的索引',index)*/this.selectIndex = index})}}
感谢观看
相关文章:

【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件
序言: 本文详细讲解了关于我们在页面上经常看到的可滚动页面和导航栏在鸿蒙开发中如何用Scroll和Tabs组件实现,介绍了Scroll和Tabs的基本用法与属性。 笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出…...

苏州 数字化科技展厅展馆-「世岩科技」一站式服务商
数字化科技展厅展馆设计施工是一个综合性强、技术要求高的项目,涉及到众多方面的要点。以下是对数字化科技展厅展馆设计施工要点的详细分析: 一、明确目标与定位 在设计之初,必须明确展厅的目标和定位。这包括确定展厅的主题、目标受众、展…...
音频搜索公司 DeepGram,定位语音搜索AI大脑,DeepGram想做“音频版”
1. 亦仁分享 DeepGram 成立于 2015 年,位于美国山景城,是一家基于 AI 技术的音频搜索引擎公司。运用机器学习进行语音识别、搜寻重要时刻并对音频和视频进行分类,帮助用户快速索引和浏览音频和视频文件,包括电话语音、会议语音、…...

基于php的在线租房管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...

如何评价 Python 语言的运行速度
Python 作为一门编程语言,其运行速度一直是业界讨论的焦点。它的简洁语法和广泛的应用使得它在开发过程中非常高效,然而,运行速度与一些更底层的编程语言相比存在一定的劣势。这是否是由于 Python 语法的简洁性所带来的代价?我们可…...

Tomcat系列漏洞复现
CVE-2017-12615——Tomcat put⽅法任意⽂件写⼊漏洞 漏洞描述 当 Tomcat运⾏在Windows操作系统时,且启⽤了HTTP PUT请求⽅法(例如,将 readonly初始化参数由默认值设置为false),攻击者将有可能可通过精⼼构造的攻击请求…...
K8S拉取本地docker中registry的镜像报错:http: server gave HTTP response to HTTPS client
本地部署了一个K8S集群,但是worker1和worker2的docker无法拉取外面的镜像,docker的daemon.json也配置了,无法下载,于是在master部署了一个docker registry。 但是pod还是无法拉取registry的镜像并报错。 我这里使用的是container…...

Leetcode 1235. 规划兼职工作
1.题目基本信息 1.1.题目描述 你打算利用空闲时间来做兼职工作赚些零花钱。 这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。 给你一份兼职工作表,包含开始时间 startTime,结束时…...
LeetCode 2535.数组元素和与数字和的绝对差:模拟
【LetMeFly】2535.数组元素和与数字和的绝对差:模拟 力扣题目链接:https://leetcode.cn/problems/difference-between-element-sum-and-digit-sum-of-an-array/ 给你一个正整数数组 nums 。 元素和 是 nums 中的所有元素相加求和。数字和 是 nums 中每…...

SpringCloud-pom创建Eureka
<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…...

动态规划算法专题(一):斐波那契数列模型
目录 1、动态规划简介 2、算法实战应用【leetcode】 2.1 题一:第N个泰波那契数 2.1.1 算法原理 2.1.2 算法代码 2.1.3 空间优化原理——滚动数组 2.1.4 算法代码——空间优化版本 2.2 题二:三步问题 2.2.1 算法原理 2.2.2 算法代码 2.3 题二&a…...
H.264编解码工具 - x264
一、简介 x264是一个开源的H.264/AVC视频编码库,它可以将视频数据压缩成H.264格式,并且可以从H.264格式解码出原始视频数据。 x264是以C语言编写的,并且可以在多个平台上使用,包括Windows、Linux和Mac OS等操作系统。 x264具有很高的编码效率和视频质量,它支持多种编码…...

外卖点餐小程序源码系统 单店多门店自助切换 带完整的安装代码包以及搭建部署教程
系统概述 本外卖点餐小程序源码系统旨在帮助餐饮企业和商家快速搭建一个功能完善的在线外卖平台。系统支持单店与多门店的灵活切换,方便商家根据自身业务需求进行管理和运营。同时,系统还提供了丰富的营销工具和数据分析功能,助力商家实现精…...

通过Ideal和gitbash共同实现分支合并
文章目录 背景描述:演示jy_20240704_develop分支同步到jy_dev分支方式一方式二 背景描述: 目前项目里有四个分支,分别是master、jy_20240704_develop、jy_dev、jy_qas。 其中master是主分支,其他三个分支都是根据master来创建的…...
Vue.js 组件开发
Vue.js 是一个渐进式的JavaScript框架,主要用于构建用户界面。它采用了组件化的开发方式,使得前端开发更加高效、灵活且易于维护。组件是Vue.js的核心概念之一,理解和掌握组件的开发,有助于我们高效地构建现代Web应用。 本文将涵…...

【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。
文章目录 题目一:最长回文子串题目描述:示例输入与输出:题目分析:解题思路:示例代码:深入剖析: 题目二:合并K个有序链表题目描述:示例输入与输出:题目分析&am…...

排序--希尔排序
希尔排序介绍 希尔排序核心思想就是:1,分组;2,直接插入排序:越有序越快 希尔排序就是多次利用直接插入排序的一个排序算法. 希尔排序的算法思想:间隔式分组,利用直接插入排序让组内有序,然后缩小分组再次排序,直到组数为1希尔排序的理论基础就是直接插入排序越有序越快; 希尔排…...

【教程】57帧! Mac电脑流畅运行黑神话悟空
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版,可自行搜索。(pd虚拟机里运行黑神话估计够呛的) 2、运行CrossOver…...
『大模型笔记』Docker如何清理Build Cache!
Docker如何清理Build Cache! 文章目录 一. docker system df1. 镜像(Images)2. 容器(Containers)3. 本地卷(Local Volumes)4. 构建缓存(Build Cache)5. 总结二. 构建缓存(Build Cache)删除有什么影响1. 镜像构建速度变慢2. 磁盘空间被释放3. 不会影响已构建和运行的…...

如何使用 Python 读取数据量庞大的 excel 文件
使用 pandas.read_excel 读取大文件时,的确会遇到性能瓶颈,特别是对于10万行20列这种规模的 .xlsx 文件,常规的 pandas 方法可能会比较慢。 要提高读取速度,关键是找到更高效的方式处理 Excel 文件,特别是在 Python 的…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

从数据报表到决策大脑:AI重构电商决策链条
在传统电商运营中,决策链条往往止步于“数据报表层”:BI工具整合历史数据,生成滞后一周甚至更久的销售分析,运营团队凭经验预判需求。当爆款突然断货、促销库存积压时,企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...
DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model
一、研究背景与创新点 (一)现有方法的局限性 当前智驾系统面临两大核心挑战:一是长尾问题,即系统在遇到新场景时可能失效,例如突发交通状况或非常规道路环境;二是可解释性问题,传统方法无法解释智驾系统的决策过程,用户难以理解车辆行为的依据。传统语言模型(如 BERT…...

运动控制--BLDC电机
一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...
HTMLCSS 学习总结
目录 一、HTML核心概念 三大前端技术作用 HTML基础结构 开发工具:VS Code 专业配置安装步骤: 二、HTML标签大全(含表格) 三、CSS核心技术 1. 三种引入方式对比 2.…...