鸿蒙原生ArkTS布局方式之List弹性回弹边缘效果布局深度解析
项目演示



目录
- 引言:移动应用滚动体验的重要性
- ArkUI布局系统概述
- 2.1 ArkUI声明式UI框架
- 2.2 布局组件体系
- 2.3 滚动容器组件分类
- List组件架构深度剖析
- 3.1 List组件核心特性
- 3.2 List组件构造参数详解
- 3.3 ListItem组件设计
- EdgeEffect枚举与回弹动效原理
- 4.1 EdgeEffect枚举类型定义
- 4.2 Spring弹性动效的物理原理
- 4.3 边缘效果的渲染机制
- List弹性回弹布局实现指南
- 5.1 基础实现方案
- 5.2 API 24特性适配
- 5.3 完整代码示例
- 常见错误与解决方案
- 6.1 回弹效果不生效问题
- 6.2 类型推断错误
- 6.3 性能优化建议
- 性能优化与最佳实践
- 7.1 列表性能优化策略
- 7.2 动效性能优化
- 与其他滚动容器的对比分析
- 8.1 List vs Scroll vs Grid
- 8.2 适用场景选择指南
- 进阶应用:自定义回弹效果
- 9.1 自定义边缘效果实现
- 9.2 结合动画API的高级应用
- 总结与展望
1. 引言:移动应用滚动体验的重要性
在移动应用开发中,用户与界面的交互方式发生了根本性的变化。触控操作取代了传统的鼠标键盘,成为主流的交互模式。滚动作为最常见的交互方式之一,其体验的优劣直接影响用户对应用的整体评价。
1.1 滚动体验的心理学意义
人类的触觉反馈系统非常敏感,对于屏幕上的视觉反馈有着本能的期待。当用户滑动屏幕时,希望看到的是:
- 即时响应:手指滑动时,内容应立即跟随移动
- 惯性效果:手指离开后,内容应保持一定的惯性继续滚动
- 边界反馈:当滚动到边缘时,应有明确的视觉和触觉反馈
弹性回弹效果正是为了满足第三个需求而设计的。当用户尝试滚动超出内容边界时,界面会产生"拉伸"效果,然后平滑回弹到边界位置。这种物理模拟效果让用户感受到界面的"弹性"和"生命力",极大提升了交互的愉悦感。
1.2 鸿蒙ArkUI的动效设计理念
HarmonyOS ArkUI框架秉承"自然交互"的设计理念,通过物理模拟和细腻的动画效果,打造贴近真实世界的交互体验。弹性回弹边缘效果正是这一理念的典型体现。
1.3 本文目标
本文将深入剖析鸿蒙ArkTS中List组件的弹性回弹边缘效果布局,从理论到实践,全面讲解其实现原理、使用方法和最佳实践。
2. ArkUI布局系统概述
2.1 ArkUI声明式UI框架
ArkUI是HarmonyOS提供的一套声明式UI开发框架,采用类React的组件化开发模式。与传统的命令式UI开发不同,声明式UI通过描述"UI应该是什么样子"来构建界面,系统会自动处理状态变化和UI更新。
核心特点:
- 组件化:UI由独立的组件构成,组件之间通过属性和事件通信
- 状态驱动:UI的渲染由状态数据驱动,状态变化自动触发UI更新
- 声明式语法:通过声明式描述构建UI结构,代码更简洁易懂
- 响应式布局:支持多种布局方式,自适应不同屏幕尺寸
2.2 布局组件体系
ArkUI提供了丰富的布局组件,主要分为以下几类:
| 布局类型 | 组件名称 | 适用场景 |
|---|---|---|
| 线性布局 | Column、Row | 垂直/水平方向排列子组件 |
| 弹性布局 | Flex | 类似CSS Flexbox的弹性布局 |
| 相对布局 | RelativeContainer | 基于锚点的相对位置布局 |
| 滚动布局 | List、Scroll、Grid | 需要滚动的列表或网格 |
| 层叠布局 | Stack | 组件层叠显示 |
2.3 滚动容器组件分类
在ArkUI中,滚动容器是实现可滚动界面的核心组件。主要包括:
List组件:用于垂直或水平方向的线性列表,支持高性能的虚拟化渲染,适合大量数据的展示。
Scroll组件:通用的滚动容器,支持任意内容的滚动,灵活性高但性能相对较低。
Grid组件:网格布局容器,用于二维数据的展示,如图片墙、商品列表等。
这三个组件都支持edgeEffect属性,用于设置边缘回弹效果。
3. List组件架构深度剖析
3.1 List组件核心特性
List是ArkUI中最重要的滚动容器组件之一,专为列表数据展示而设计。其核心特性包括:
虚拟化渲染:List组件采用虚拟化技术,只渲染当前可见区域的列表项,极大提升了大数据量列表的性能。
灵活的布局方向:支持垂直和水平两种布局方向,通过listDirection属性控制。
边缘效果:通过edgeEffect属性设置边缘回弹效果,提供丰富的交互反馈。
滚动控制:支持滚动到指定位置、滚动监听等高级功能。
分割线:内置分割线支持,通过divider属性配置。
3.2 List组件构造参数详解
List组件的构造函数签名如下:
List(value?: { initialIndex?: number, space?: number, scroller?: Scroller })
参数说明:
- initialIndex:列表初始滚动位置对应的列表项索引,默认值为0。
- space:列表项之间的间距,单位为vp(虚拟像素)。
- scroller:滚动控制器,用于手动控制滚动行为。
常用属性:
- listDirection:设置列表滚动方向,可选值为
Axis.Vertical(垂直)或Axis.Horizontal(水平),默认为垂直方向。 - edgeEffect:设置边缘效果,可选值为
EdgeEffect.None(无效果)、EdgeEffect.Spring(弹性回弹)或EdgeEffect.Fade(渐变淡出)。 - divider:设置列表项分割线,类型为
ListItemDivider。 - height/width:设置List的尺寸,通常设置为百分比或具体数值。
- scrollBar:设置滚动条显示模式,可选值为
BarState.Auto、BarState.On或BarState.Off。
3.3 ListItem组件设计
ListItem是List的子组件,用于定义列表项的内容。每个ListItem代表列表中的一个数据项。
设计要点:
- ListItem必须作为List的直接子组件使用
- ListItem内部可以包含任意组件,如Text、Image、Column、Row等
- ListItem支持点击事件和长按事件
- ListItem的尺寸通常由父容器List控制
ListItem常用属性:
- height:设置列表项高度
- width:设置列表项宽度,通常设置为’100%'以填满List宽度
- onClick:点击事件回调
- onLongPress:长按事件回调
4. EdgeEffect枚举与回弹动效原理
4.1 EdgeEffect枚举类型定义
EdgeEffect是ArkUI中用于控制滚动容器边缘效果的枚举类型,定义如下:
enum EdgeEffect {
None,
Spring,
Fade
}
枚举值说明:
- EdgeEffect.None:无边缘效果。当滚动到边界时,内容会立即停止,没有任何视觉反馈。
- EdgeEffect.Spring:弹性回弹效果。当滚动到边界时,内容会继续拉伸一段距离,然后平滑回弹到边界位置。这是最常用的边缘效果,提供了自然的物理模拟体验。
- EdgeEffect.Fade:渐变淡出效果。当滚动到边界时,内容会逐渐淡出,提示用户已到达边界。
4.2 Spring弹性动效的物理原理
弹性回弹效果的实现基于物理模拟,主要涉及以下几个物理概念:
胡克定律:弹性物体的形变与所受的力成正比,即F = kx,其中k是弹性系数,x是形变量。
阻尼效应:物体在运动过程中受到的阻力,用于模拟现实世界中的摩擦力和空气阻力,使动画能够平滑停止。
弹性系数和阻尼系数的调整:ArkUI内部已经优化了弹性系数和阻尼系数,确保回弹效果自然流畅。开发者无需手动调整这些参数。
动画曲线:弹性回弹动画采用非线性的动画曲线,初期形变速度较快,然后逐渐减速回弹,形成自然的弹性效果。
4.3 边缘效果的渲染机制
边缘效果的渲染涉及以下几个步骤:
1. 边界检测:系统实时检测滚动位置,判断是否到达内容边界。
2. 形变计算:当用户继续拖动超出边界时,系统根据拖动距离计算内容的形变量。
3. 视觉渲染:根据计算出的形变量,对内容进行视觉上的拉伸或渐变处理。
4. 回弹动画:当用户松开手指时,系统启动回弹动画,将内容平滑恢复到边界位置。
5. 速度衰减:在回弹过程中,应用阻尼效应,使动画自然减速停止。
5. List弹性回弹布局实现指南
5.1 基础实现方案
实现List弹性回弹效果的核心步骤如下:
步骤1:导入必要的模块
虽然ArkUI的核心组件不需要显式导入,但在某些情况下可能需要导入特定的类型或枚举:
import { EdgeEffect, Axis } from '@ohos.arkui';
步骤2:创建List组件并设置edgeEffect属性
List() {
// 列表项内容
}
.edgeEffect(EdgeEffect.Spring)
步骤3:确保List有明确的尺寸
List必须有明确的高度和宽度才能正常滚动。通常设置为百分比或具体数值:
List() {
// 列表项内容
}
.height('80%')
.width('100%')
.edgeEffect(EdgeEffect.Spring)
步骤4:提供足够的列表项数据
列表必须有足够的内容才能滚动,否则回弹效果无法展示:
private listData: number[] = this.generateListData();
private generateListData(): number[] {
const data: number[] = [];
for (let i = 1; i <= 20; i++) {
data.push(i);
}
return data;
}
5.2 API 24特性适配
在API 24中,List组件的edgeEffect属性使用方式保持一致,但有一些需要注意的变化:
类型严格性增强:API 24对类型推断的要求更加严格,需要避免使用隐式any类型。
Array.from的泛型问题:在API 24中,Array.from的泛型推断可能会导致编译错误,建议使用显式的for循环代替。
linearGradient颜色格式:linearGradient的colors参数需要使用[ResourceColor, number][]格式,而不是简单的字符串数组。
5.3 完整代码示例
以下是一个完整的List弹性回弹效果示例,符合API 24规范:
@Entry
@Component
struct ListEdgeEffectDemo {
// 生成20个列表项数据,确保列表可滚动
private listData: number[] = this.generateListData();
// 生成列表数据的方法
private generateListData(): number[] {
const data: number[] = [];
for (let i = 1; i <= 20; i++) {
data.push(i);
}
return data;
}
build() {
// 使用Column作为根容器,占满整个屏幕
Column() {
// 标题组件,说明当前演示的功能
Text('List弹性回弹边缘效果演示')
.fontSize(22)
.fontWeight(FontWeight.Bold)
.margin({ top: 20, bottom: 20 })
.textAlign(TextAlign.Center)
.width('100%');
// List组件:核心滚动容器
// 关键属性:edgeEffect(EdgeEffect.Spring) - 设置弹性回弹边缘效果
List({ space: 10 }) {
// 遍历数据生成列表项
ForEach(this.listData, (item: number) => {
ListItem() {
// 列表项内容:卡片式布局,展示序号和提示文字
Column() {
Text(`列表项 ${item}`)
.fontSize(18)
.fontWeight(FontWeight.Medium);
Text('向上/向下滑动查看回弹效果')
.fontSize(12)
.fontColor(Color.Grey)
.margin({ top: 8 });
}
.padding(20)
.width('100%')
.backgroundColor(Color.White)
.borderRadius(12)
.shadow({ radius: 4, color: '#00000010', offsetY: 2 });
}
.width('100%');
}, (item: number) => item.toString());
}
// 核心配置:设置弹性回弹边缘效果
// EdgeEffect.Spring 表示当列表滚动到边缘时,会产生弹性拉伸和回弹动画
// 这是鸿蒙原生的物理动效,提供自然流畅的滚动体验
.edgeEffect(EdgeEffect.Spring)
// 设置List高度为父容器剩余空间的80%
.height('80%')
// 设置List宽度为父容器宽度的90%,左右留边距
.width('90%')
// 设置背景色,增强视觉效果
.backgroundColor('#f5f5f5')
// 设置圆角
.borderRadius(16)
// 设置内边距
.padding(16);
}
// 根容器占满整个屏幕高度
.height('100%')
// 根容器占满整个屏幕宽度
.width('100%')
// 设置背景色
.backgroundColor('#e8f4fd');
}
}
代码解析:
-
数据准备:通过
generateListData方法生成20个数字作为列表数据,确保列表内容足够长,可以滚动。 -
布局结构:使用Column作为根容器,包含标题和List组件。
-
List配置:
- 设置
space: 10,列表项之间的间距为10vp - 设置
.edgeEffect(EdgeEffect.Spring),启用弹性回弹效果 - 设置高度为80%,宽度为90%,留出适当的边距
- 设置
-
列表项设计:每个列表项使用卡片式设计,包含序号和提示文字,添加了圆角和阴影效果。
-
视觉优化:设置了背景色、圆角、内边距等样式,提升整体视觉效果。
6. 常见错误与解决方案
6.1 回弹效果不生效问题
问题描述:设置了.edgeEffect(EdgeEffect.Spring),但滚动到边缘时没有弹性回弹效果。
可能原因及解决方案:
原因1:List没有设置明确的高度
List组件必须有明确的高度才能滚动。如果高度设置为’auto’或没有设置,列表会根据内容自动调整高度,不会产生滚动效果。
// 错误示例
List() {
// 列表项
}
.edgeEffect(EdgeEffect.Spring)
// 正确示例
List() {
// 列表项
}
.height('80%') // 设置明确的高度
.edgeEffect(EdgeEffect.Spring)
原因2:列表内容不足以滚动
如果列表项数量太少,内容高度小于List的高度,列表无法滚动,回弹效果自然无法展示。
// 错误示例:只有3个列表项,可能无法滚动
private listData: number[] = [1, 2, 3];
// 正确示例:至少需要10-20个列表项,确保可以滚动
private listData: number[] = this.generateListData();
private generateListData(): number[] {
const data: number[] = [];
for (let i = 1; i <= 20; i++) {
data.push(i);
}
return data;
}
原因3:edgeEffect属性设置位置错误
根据经验,edgeEffect属性必须设置在实际的滚动容器上,而不是其父容器上。
// 错误示例:在Column上设置edgeEffect
Column() {
List() {
// 列表项
}
}
.edgeEffect(EdgeEffect.Spring)
// 正确示例:在List上设置edgeEffect
Column() {
List() {
// 列表项
}
.edgeEffect(EdgeEffect.Spring)
}
原因4:使用了错误的EdgeEffect值
确保使用的是EdgeEffect.Spring而不是EdgeEffect.None。
// 错误示例
.edgeEffect(EdgeEffect.None)
// 正确示例
.edgeEffect(EdgeEffect.Spring)
6.2 类型推断错误
在API 24中,ArkTS编译器对类型推断的要求更加严格,常见的错误包括:
错误1:Array.from泛型推断问题
// 错误示例:编译器无法正确推断泛型参数
private listData: number[] = Array.from({ length: 20 }, (_, i) => i + 1);
// 正确示例:使用显式的for循环
private listData: number[] = this.generateListData();
private generateListData(): number[] {
const data: number[] = [];
for (let i = 1; i <= 20; i++) {
data.push(i);
}
return data;
}
错误2:使用any类型
// 错误示例:使用any类型
private listData: any[] = [1, 2, 3];
// 正确示例:使用明确的类型
private listData: number[] = [1, 2, 3];
错误3:linearGradient颜色格式错误
// 错误示例:使用字符串数组
.linearGradient({
direction: GradientDirection.Bottom,
colors: ['#e8f4fd', '#ffffff']
})
// 正确示例:使用ResourceColor格式
.linearGradient({
direction: GradientDirection.Bottom,
colors: [[Color('#e8f4fd'), 0], [Color('#ffffff'), 1]]
})
// 或者使用简单的backgroundColor
.backgroundColor('#e8f4fd')
6.3 性能优化建议
问题描述:列表滚动时出现卡顿或掉帧现象。
可能原因及解决方案:
原因1:列表项过于复杂
列表项中包含过多的组件或复杂的布局会导致渲染性能下降。
// 优化建议:简化列表项结构
ListItem() {
Row() {
Image($r('app.media.icon'))
.width(40)
.height(40);
Column() {
Text('标题')
.fontSize(16);
Text('描述')
.fontSize(12)
.fontColor(Color.Grey);
}
.margin({ left: 10 });
}
.padding(10);
}
原因2:没有使用keyGenerator
在ForEach中没有提供keyGenerator会导致列表项更新时无法正确复用,影响性能。
// 错误示例:没有keyGenerator
ForEach(this.listData, (item: number) => {
ListItem() {
Text(`列表项 ${item}`);
}
});
// 正确示例:提供keyGenerator
ForEach(this.listData, (item: number) => {
ListItem() {
Text(`列表项 ${item}`);
}
}, (item: number) => item.toString());
原因3:大量图片没有做懒加载
如果列表项中包含大量图片,没有做懒加载会导致内存占用过高和加载延迟。
// 优化建议:使用图片懒加载
Image(this.getImageUrl(item))
.width(100)
.height(100)
.objectFit(ImageFit.Cover)
.interpolation(ImageInterpolation.High)
7. 性能优化与最佳实践
7.1 列表性能优化策略
虚拟化渲染优化:
List组件默认采用虚拟化渲染,只渲染可见区域的列表项。但在某些情况下,需要进一步优化:
避免嵌套滚动:不要在List中嵌套另一个List或Scroll组件,这会导致滚动冲突和性能下降。
控制列表项高度:尽量保持列表项高度一致,便于List组件进行预计算和优化。
使用固定高度:如果列表项高度固定,设置固定高度可以减少布局计算。
ListItem() {
// 列表项内容
}
.height(80) // 固定高度
数据加载优化:
分页加载:对于大量数据,采用分页加载策略,避免一次性加载所有数据。
异步加载:数据加载放在异步线程中进行,避免阻塞UI线程。
缓存机制:对于重复使用的数据,使用缓存机制减少重复请求。
7.2 动效性能优化
减少动效复杂度:
避免在列表项中使用过于复杂的动画效果,这会增加GPU的渲染负担。
使用硬件加速:
确保动效使用GPU加速,可以通过设置适当的属性来触发硬件加速。
限制动效范围:
只在必要的组件上应用动效,避免全局动效。
优化边缘效果:
虽然EdgeEffect.Spring效果很好,但在某些低端设备上可能会有性能问题。可以根据设备性能动态选择边缘效果:
// 根据设备性能选择边缘效果
.edgeEffect(this.isHighPerformanceDevice ? EdgeEffect.Spring : EdgeEffect.Fade)
8. 与其他滚动容器的对比分析
8.1 List vs Scroll vs Grid
List组件:
- 适用场景:线性列表数据展示,如消息列表、联系人列表等
- 性能:最高,采用虚拟化渲染
- 边缘效果:支持EdgeEffect枚举
- 布局方向:支持垂直和水平方向
- 子组件:必须使用ListItem
Scroll组件:
- 适用场景:任意内容的滚动,如长图文页面、表单页面等
- 性能:中等,不支持虚拟化渲染
- 边缘效果:支持EdgeEffect枚举
- 布局方向:支持垂直和水平方向
- 子组件:任意组件
Grid组件:
- 适用场景:二维网格数据展示,如图片墙、商品列表等
- 性能:较高,支持虚拟化渲染
- 边缘效果:支持EdgeEffect枚举
- 布局方向:支持垂直和水平方向
- 子组件:必须使用GridItem
8.2 适用场景选择指南
选择List的场景:
- 需要展示大量线性数据
- 需要高性能的虚拟化渲染
- 需要列表项的点击、长按等交互
- 需要分割线、列表项间距等特性
选择Scroll的场景:
- 内容结构不规则,无法用List或Grid表示
- 需要在滚动内容中混合多种布局
- 内容量不大,不需要虚拟化渲染
选择Grid的场景:
- 需要展示二维网格数据
- 需要多行多列的布局
- 需要网格项的点击、长按等交互
9. 进阶应用:自定义回弹效果
9.1 自定义边缘效果实现
虽然ArkUI提供了三种内置的边缘效果,但在某些场景下,可能需要实现自定义的边缘效果。
方案1:使用Scroll组件配合动画API
通过Scroll组件和动画API,可以实现更复杂的边缘效果:
@Entry
@Component
struct CustomEdgeEffectDemo {
@State scrollOffset: number = 0;
private scroller: Scroller = new Scroller();
build() {
Column() {
Scroll(this.scroller) {
Column() {
// 滚动内容
ForEach(this.listData, (item: number) => {
Text(`列表项 ${item}`)
.height(60)
.width('100%')
.textAlign(TextAlign.Center)
.backgroundColor(Color.White)
.margin({ bottom: 10 });
}, (item: number) => item.toString());
}
}
.onScroll((offset: number) => {
this.scrollOffset = offset;
})
.height('80%')
.width('100%');
}
.height('100%')
.width('100%');
}
}
方案2:使用自定义组件
通过自定义组件,可以完全控制边缘效果的实现:
@Component
struct CustomEdgeList {
private listData: number[] = [];
build() {
Stack() {
// 背景装饰效果
if (this.isAtTop) {
// 顶部边缘效果
}
if (this.isAtBottom) {
// 底部边缘效果
}
// 实际的List组件
List() {
ForEach(this.listData, (item: number) => {
ListItem() {
Text(`列表项 ${item}`);
}
}, (item: number) => item.toString());
}
.edgeEffect(EdgeEffect.None) // 禁用内置边缘效果
.onScroll((offset: number) => {
// 检测滚动位置,实现自定义效果
this.isAtTop = offset <= 0;
this.isAtBottom = offset >= this.maxOffset;
});
}
}
}
9.2 结合动画API的高级应用
通过结合ArkUI的动画API,可以实现更丰富的交互效果:
弹簧动画:
@Entry
@Component
struct SpringAnimationDemo {
@State scale: number = 1;
build() {
Column() {
Text('弹性动画')
.fontSize(24)
.scale({ x: this.scale, y: this.scale })
.onClick(() => {
// 使用springCurve实现弹簧动画
animateTo({
curve: curves.springCurve(0.5, 0.3)
}, () => {
this.scale = this.scale === 1 ? 1.2 : 1;
});
});
}
.height('100%')
.width('100%')
.justifyContent(FlexAlign.Center);
}
}
关键帧动画:
@Entry
@Component
struct KeyframeAnimationDemo {
@State opacity: number = 1;
@State translateY: number = 0;
build() {
Column() {
Text('关键帧动画')
.fontSize(24)
.opacity(this.opacity)
.translate({ y: this.translateY })
.onClick(() => {
animateTo({
duration: 1000,
keyframes: [
{
value: 0.33,
styles: { opacity: 1, translateY: 0 }
},
{
value: 0.66,
styles: { opacity: 0.5, translateY: 50 }
},
{
value: 1,
styles: { opacity: 1, translateY: 0 }
}
]
}, () => {
// 动画结束后的回调
});
});
}
.height('100%')
.width('100%')
.justifyContent(FlexAlign.Center);
}
}
10. 总结与展望
10.1 本文总结
本文深入剖析了鸿蒙ArkTS中List组件的弹性回弹边缘效果布局,主要内容包括:
-
ArkUI布局系统概述:介绍了ArkUI的声明式UI框架、布局组件体系和滚动容器分类。
-
List组件架构:详细讲解了List组件的核心特性、构造参数和ListItem组件设计。
-
EdgeEffect枚举:分析了EdgeEffect枚举的三种类型及其原理,重点讲解了Spring弹性动效的物理模拟机制。
-
实现指南:提供了完整的代码示例,演示了如何在API 24中正确实现List弹性回弹效果。
-
常见错误与解决方案:总结了开发过程中常见的问题及其解决方案,包括回弹效果不生效、类型推断错误等。
-
性能优化:提供了列表性能优化和动效性能优化的最佳实践。
-
对比分析:对比了List、Scroll、Grid三种滚动容器的特点和适用场景。
-
进阶应用:介绍了自定义边缘效果的实现方法和结合动画API的高级应用。
10.2 未来展望
随着HarmonyOS NEXT的不断发展,ArkUI框架将继续完善和优化,为开发者提供更强大、更高效的UI开发能力。未来可能的发展方向包括:
更丰富的动效API:提供更多的动画曲线和效果,支持更复杂的交互场景。
性能进一步提升:优化虚拟化渲染算法,支持更高性能的列表渲染。
自定义边缘效果:提供官方的自定义边缘效果API,让开发者能够更灵活地控制边缘效果。
跨平台一致性:确保在不同设备上的动效体验保持一致,提供统一的设计语言。
附录:完整代码示例
以下是本文中使用的完整代码示例,可直接复制到项目中运行:
Index.ets
@Entry
@Component
struct Index {
private listData: number[] = this.generateListData();
private generateListData(): number[] {
const data: number[] = [];
for (let i = 1; i <= 20; i++) {
data.push(i);
}
return data;
}
build() {
Column() {
Text('List弹性回弹边缘效果演示')
.fontSize(22)
.fontWeight(FontWeight.Bold)
.margin({ top: 20, bottom: 20 })
.textAlign(TextAlign.Center)
.width('100%');
List({ space: 10 }) {
ForEach(this.listData, (item: number) => {
ListItem() {
Column() {
Text(`列表项 ${item}`)
.fontSize(18)
.fontWeight(FontWeight.Medium);
Text('向上/向下滑动查看回弹效果')
.fontSize(12)
.fontColor(Color.Grey)
.margin({ top: 8 });
}
.padding(20)
.width('100%')
.backgroundColor(Color.White)
.borderRadius(12)
.shadow({ radius: 4, color: '#00000010', offsetY: 2 });
}
.width('100%');
}, (item: number) => item.toString());
}
.edgeEffect(EdgeEffect.Spring)
.height('80%')
.width('90%')
.backgroundColor('#f5f5f5')
.borderRadius(16)
.padding(16);
}
.height('100%')
.width('100%')
.backgroundColor('#e8f4fd');
}
}
文档版本:v1.0
API版本:HarmonyOS NEXT API 24
编写日期:2026年7月
适用范围:HarmonyOS NEXT 应用开发
更多推荐

所有评论(0)