【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件

news2024/9/27 4:53:00

序言:

本文详细讲解了关于我们在页面上经常看到的可滚动页面和导航栏在鸿蒙开发中如何用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().yOffset
          AlertDialog.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 {
  @Builder
  myBuilder(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


  @Builder
  myBuilder(itemIndex:number,title:string,img:ResourceStr,selImg:ResourceStr){
    //如果激活的是自己,图文/文本,都需要调整样式->需要区分不同的 tabar
    Column(){
      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
    })
  }


}

感谢观看

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

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

相关文章

晶圆厂如何突破多网隔离实现安全稳定又快速的跨网域文件传输?

在当今数字化时代,晶圆厂作为高科技产业的核心,其生产效率和数据安全性直接影响到整个半导体行业的竞争力。晶圆厂内部网络通常被划分为多个安全域,如生产网络、研发网络、办公网络等,以确保数据安全和防止敏感信息泄露。然而&…

【RabbitMQ 项目】服务端:服务器模块

文章目录 一.编写思路二.代码实践三.服务端模块关系总结 一.编写思路 成员变量: muduo 库中的 TCP 服务器EventLoop 对象:用于主线程循环监控连接事件协议处理句柄分发器:用于初始化协议处理器,便于把不同请求派发给不同的业务处理…

大语言模型在构建UNSPSC 分类数据中的应用

UNSPSC 是联合国标准产品和服务代码。UNSPSC由联合国开发计划署(UNDP)和Dun & Bradstreet公司(D & B)于1998年联合制定,自2003年以来一直由GS1 US管理。GS1 US 将在 2024 年底前将 UNSPSC 的管理权移交给 UNDP…

【HarmonyOS】TaskPool非阻塞UI

TaskPool方法不会阻塞UI,如果做上传图片的功能加载Loading记得使用TaskPool,Promise、Async/Await都会阻塞UI 【引言】 发现Promise可能会阻塞UI,尝试使用async或await,但发现它们仍然会导致阻塞。后来看到chaoxiaoshu回复的Tas…

数字孪生平台,助力制造设备迈入超感知与智控新时代!

痛点剖析 当前,制造业面临系统分散导致的数据孤岛问题,严重阻碍了有效监管与统计分析;同时,设备多样化且兼容性不足,增加了管理难度;台账记录方式混乱,工单审批流程繁琐且效率低下;…

electron使用npm install出现下载失败的问题

我在使用electron进行下载时,经常出现一个错误。 HTTPError: Response code 404 (Not Found) for https://registry.npmmirror.com/v21.4.4/electron-v21.4.4-win32-x64.zip 这个时候需要修改一些npm的配置。使用命令npm config list -ls 滑到下面,找到一…

第一个maven web工程(eclipse)

1、点击file--》new--》Maven Project,如下: 2、直接next,如下 3、搜索web原型,如下 4、填写项目的坐标,如下 5、创建完成后,需要自己补一个文件夹,名称为java,如下: …

class 023 随机快速排序

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

云中红队系列 | 使用 AWS API 配置Fireprox进行 IP轮换

在渗透测试评估期间,某些活动需要一定程度的自动化,例如从 LinkedIn 等网站抓取网页以收集可用于社会工程活动、密码喷洒登录门户或测试时盲注的有效员工姓名列表网络应用程序。但是,从单个源 IP 地址执行这些活动可能会导致在测试期间被拦截…

【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】

一、接下来,我们来说这个新特性页面 1.首先,看一下我们的示例程序,这里改一下,加一个叹号, command + R, 好,首先啊,这里边有一个新特性页面,当我这个程序是第一次安装、第一次运行、还有呢、就是当这个应用程序更新的时候,我应该去加载这个新特性页面, 然后呢,这…

JPEG图像的DCT(Discrete Cosine Transform)变换公式代码详解

引 言 网络上图像在传输过程中为节省内存空间主要采用jpeg格式。jpeg图属于有损压缩图像的一种。在图像篡改检测过程中,可以利用jpeg图像的单双压缩伪影的不同而判别图像为伪造图并可以定位伪造区域。RGB图像变成jpeg图像过程中涉及从RGB图变成YCbCr图像&#xff0c…

使用离火插件yoloV8数据标注,模型训练

1. 启动 2.相关配置 2.1 data.yaml path: D:/yolo-tool/yaunshen-yolov8/YOLOv8ys/YOLOv8-CUDA10.2/1/datasets/ceshi001 train: images val: images names: [蔡徐坤,篮球] 2.2 cfg.yaml # Ultralytics YOLOv8, GPL-3.0 license # Default training settings and hyp…

物联网行业中通信断线重连现象介绍以及如何实现

01 概述 断线重连是指在计算机网络中,当网络连接遇到异常中断或者断开时,系统会自动尝试重新建立连接,以保证网络通信的连续性和稳定性。这是一种常见的网络通信技术,广泛应用于各种计算机网络场景,包括互联网、局域…

蓝队技能-应急响应篇Web内存马查杀Spring框架型中间件型JVM分析Class提取

知识点: 1、应急响应-Web框架内存马-分析&清除 2、应急响应-Web中间件内存马-分析&清除 注:框架型内存马与中间件内存马只要网站重启后就清除了。 目前Java内存马具体分类: 1、传统Web应用型内存马 Servlet型内存马:…

探索EasyCVR视频融合平台:在视频编解码与转码领域的灵活性优势

随着视频监控技术的飞速发展,各类应用场景对视频数据的处理需求日益复杂多样。从公共安全到智慧城市,再到工业监控,高效、灵活的视频处理能力成为衡量视频融合平台性能的重要标准。在众多解决方案中,EasyCVR视频融合平台凭借其在视…

Java面试题之JVM20问

1、说说 JVM 内存区域 这张图就是一个 JVM 运行时数据图,「紫色区域代表是线程共享的区域」,JAVA 程序在运行的过程中会把他管理的内存划分为若干个不同的数据区域,「每一块儿的数据区域所负责的功能都是不同的,他们也有不同的创建…

Django设计批量导入Excel数据接口(包含图片)

Django设计批量导入Excel数据接口(包含图片) 目录 Django设计批量导入Excel数据接口(包含图片)示例xlsx文件接口详情前端上传FormData后端APIView调用函数 Django 4.2.7 openpyxl 3.1.5示例xlsx文件 接口详情 前端上传FormData …

2-104 基于MATLAB的动态模式分解(Dynamic Mode Decomposition,DMD)

基于MATLAB的动态模式分解(Dynamic Mode Decomposition,DMD),从人类步行数据中提取信息.动态模式分解是一种降维算法,在流体力学领域引入的。与提供内部坐标系和相应投影的SVD相似,DMD为您提供随不同时间行为演变的特定…

【架构】前台、中台、后台

文章目录 前台、中台、后台1. 前台(Frontend)特点:技术栈: 2. 中台(Middleware)特点:技术栈: 3. 后台(Backend)特点:技术栈: 示例场景…

PMOS的原理

PMOS(金属氧化物半导体场效应晶体管)是一种以空穴为主要载流子的场效应管,它的D极(漏极)、S极(源极)和G极(栅极)的工作原理如下: 1. D极(漏极&am…