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

ops/2025/2/11 9:36:19/

  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.Graybuild() {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.Verticalconsole.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@BuildermyBuildBar(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)}
}

  效果图:


 


http://www.ppmy.cn/ops/157491.html

相关文章

什么是DDOS网络攻击?

什么是DDoS攻击&#xff1f; DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击是一种网络攻击手段&#xff0c;通过大量合法或恶意请求占用目标服务器、网络或资源&#xff0c;使其无法正常为用户提供服务。 DDoS攻击原理 攻击者利…

Java的多态:使用内存图理解运行时多态

一、什么是多态 多态指多种形态&#xff0c;多态允许同一个方法在不同对象中表现出不同的行为。换句话说&#xff0c;在多态的情况下&#xff0c;相同的接口可以指向不同的实现。 父类的引用指向子类的对象&#xff0c;子类的对象也可以向上转型到父类的类型接收&#xff0c;…

MySQL实战宝典:从调优到高可用架构设计全解析

MySQL作为全球最流行的开源关系数据库&#xff0c;支撑着互联网70%以上的在线业务。本文将揭秘淘宝双11每秒百万级TPS背后的数据库设计哲学&#xff0c;手把手带您构建高性能、高可靠的MySQL体系。 &#x1f680; 一、MySQL架构核心揭秘 存储引擎双雄对决&#xff1a; sql 复…

openGauss 3.0 数据库在线实训课程6:学习用户一次只能连接到一个数据库,没法访问其他数据库的对象

前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss体系结构&#xff0c;通过实验&#xff0c;了解用户一次只能连接到一个数据库&#xff0c;没法访问其他数据库的对象。 课程作…

北京青蓝智慧科技: 2025年ITSS IT服务项目经理的转型与挑战

2025年&#xff0c;随着信息技术的持续快速发展&#xff0c;IT服务管理&#xff08;ITSS&#xff09;在企业运营中的关键作用将进一步凸显。作为一位资深IT行业分析师&#xff0c;我预测2025年的IT服务经理将面临诸多挑战&#xff0c;同时也将迎来新的发展机遇。 人工智能&…

Redis03 - 高可用

Redis高可用 文章目录 Redis高可用一&#xff1a;主从复制 & 读写分离1&#xff1a;主从复制的作用2&#xff1a;主从复制原理2.1&#xff1a;全量复制2.2&#xff1a;增量复制&#xff08;环形缓冲区&#xff09; 3&#xff1a;主从复制实际演示3.1&#xff1a;基本流程准…

TRL - Transformer Reinforcement Learning(基于Transformer的强化学习)

TRL - Transformer Reinforcement Learning&#xff08;基于Transformer的强化学习&#xff09; flyfish 地址&#xff1a;https://github.com/huggingface/trl TRL是一个用于对基础模型进行后训练的全面库&#xff0c;是一个前沿的库&#xff0c;专门用于使用先进的技术&am…

使用deepseek快速创作ppt

目录 1.在DeekSeek生成PPT脚本2.打开Kimi3.最终效果 DeepSeek作为目前最强大模型&#xff0c;其推理能力炸裂&#xff0c;但是DeepSeek官方没有提供生成PPT功能&#xff0c;如果让DeepSeek做PPT呢&#xff1f; 有个途径&#xff1a;在DeepSeek让其深度思考做出PPT脚本&#xf…