本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
Swiper是鸿蒙(HarmonyOS)开发中常用的滑块视图容器组件,用于实现轮播图、图片滑动展示等交互效果。本文将全面介绍Swiper组件的使用方法,包括基础用法、常用API、高级特性以及示例。
一、Swiper组件概述
Swiper组件是鸿蒙ArkUI框架提供的滑块视图容器,主要用于实现子组件的滑动轮播显示功能。它具有以下特点:
- 支持水平或垂直方向的滑动
- 可设置自动轮播和循环播放
- 提供多种导航点指示器样式
- 支持手势滑动和控制器切换
- 可自定义动画效果和切换时长
Swiper组件从API Version 7开始支持,后续版本不断新增功能。
二、Swiper基础使用
1. 基本结构
Swiper组件可以包含任意数量的子组件,这些子组件可以是系统组件或自定义组件。
@Entry
@Component
struct BasicSwiperExample {
build() {
Swiper() {
Text("页面1")
.width('100%')
.height('100%')
.backgroundColor(Color.Red)
.textAlign(TextAlign.Center)
.fontSize(30)
Text("页面2")
.width('100%')
.height('100%')
.backgroundColor(Color.Green)
.textAlign(TextAlign.Center)
.fontSize(30)
Text("页面3")
.width('100%')
.height('100%')
.backgroundColor(Color.Blue)
.textAlign(TextAlign.Center)
.fontSize(30)
}
.height(200)
}
}
2. 尺寸设置
Swiper的尺寸行为有以下特点:
- 如果未设置固定尺寸,Swiper会根据子组件大小自动调整
- 如果设置了固定尺寸,轮播过程中将保持该尺寸
- 建议明确设置Swiper的高度,避免布局问题
三、Swiper常用API详解
1. 循环播放(loop)
loop
属性控制是否开启循环播放模式:
Swiper() {
// 子组件
}
.loop(true) // 开启循环
true
: 在第一页可以向前切换到最后一页,在最后一页可以向后切换到第一页false
: 在第一页和最后一页时无法继续向前或向后切换
2. 自动轮播(autoPlay)
autoPlay
属性控制是否自动播放:
Swiper() {
// 子组件
}
.autoPlay(true) // 开启自动播放
.interval(3000) // 设置轮播间隔为3秒
interval
属性设置轮播间隔,默认2000毫秒- 当
loop
为false时,自动播放到最后一页会停止
3. 导航点指示器(indicator)
Swiper提供多种导航点指示器样式:
// 1. 默认圆点指示器
Swiper().indicator(true)
// 2. 自定义样式
Swiper().indicatorStyle({
size: 30, // 导航点大小
left: 0, // 左边距
color: Color.Red // 默认颜色
})
// 3. 数字指示器(API 10+)
Swiper().indicator(new DigitIndicator())
导航点可以设置位置、大小、颜色等属性。
4. 页面切换方式
Swiper支持三种页面切换方式:
- 手势滑动:用户手指滑动切换
- 点击导航点:点击指示器上的点直接跳转
- 控制器切换:通过SwiperController编程控制
private swiperController: SwiperController = new SwiperController()
build() {
Column() {
Swiper(this.swiperController) {
// 子组件
}
Row() {
Button('上一页').onClick(() => {
this.swiperController.showPrevious()
})
Button('下一页').onClick(() => {
this.swiperController.showNext()
})
}
}
}
5. 轮播方向(vertical)
vertical
属性控制轮播方向:
Swiper()
.vertical(true) // 垂直方向轮播
true
: 垂直方向轮播false
: 水平方向轮播(默认)
6. 多页面显示(displayCount)
displayCount
属性可以设置一页显示多个子组件:
Swiper()
.displayCount(2) // 每页显示2个子组件
这在需要展示缩略图或卡片列表时非常有用。
四、Swiper高级特性
1. 动画控制
Swiper提供多种动画控制属性:
Swiper()
.duration(500) // 设置切换动画时长为500ms
.curve(Curve.EaseInOut) // 设置动画曲线
duration
: 动画时长,默认400mscurve
: 动画曲线,默认弹簧曲线
2. 预加载(cachedCount)
cachedCount
属性可以预加载前后页面,提升性能:
Swiper()
.cachedCount(1) // 预加载前后各1页
这在子组件内容复杂或需要网络加载时特别有用。
3. 禁用滑动(disableSwipe)
disableSwipe
属性可以禁用手势滑动:
Swiper()
.disableSwipe(true) // 禁用手势滑动
此时只能通过控制器切换页面。
4. 子组件可见性控制
Swiper子组件的visibility
属性有以下行为:
Visibility.None
: 不占位Visibility.Hidden
: 占位但不显示- 其他: 正常显示
五、Swiper实战示例
1. 图片轮播器
@Entry
@Component
struct ImageSwiperExample {
private imageList: string[] = [
'/common/image1.jpg',
'/common/image2.jpg',
'/common/image3.jpg'
]
build() {
Swiper() {
ForEach(this.imageList, (item: string) => {
Image(item)
.width('100%')
.height(200)
.objectFit(ImageFit.Cover)
})
}
.height(200)
.indicator(true)
.autoPlay(true)
.loop(true)
}
}
2. 垂直文字轮播
@Entry
@Component
struct VerticalTextSwiper {
private newsList: string[] = [
'鸿蒙4.0正式发布',
'ArkUI 3.0带来全新开发体验',
'华为开发者大会2025即将举行'
]
build() {
Swiper() {
ForEach(this.newsList, (item: string) => {
Text(item)
.width('90%')
.height(80)
.fontSize(16)
.textAlign(TextAlign.Center)
})
}
.height(80)
.vertical(true)
.autoPlay(true)
.indicator(false)
}
}
3. 卡片式轮播
@Entry
@Component
struct CardSwiperExample {
@State currentIndex: number = 0
private cardData = [
{ title: '卡片1', color: Color.Red },
{ title: '卡片2', color: Color.Green },
{ title: '卡片3', color: Color.Blue }
]
build() {
Column() {
Swiper({ controller: new SwiperController() }) {
ForEach(this.cardData, (item, index) => {
Column() {
Text(item.title)
.fontSize(20)
.fontColor(Color.White)
}
.width('80%')
.height(150)
.backgroundColor(item.color)
.borderRadius(10)
.justifyContent(FlexAlign.Center)
.onClick(() => {
console.log(`点击了${item.title}`)
})
})
}
.height(180)
.displayCount(1.2) // 显示1.2个卡片,产生预览效果
.itemSpace(20)
Text(`当前卡片: ${this.currentIndex + 1}/${this.cardData.length}`)
.margin({ top: 10 })
}
.width('100%')
.padding(20)
}
}
六、Swiper使用技巧与注意事项
-
性能优化:
- 对于复杂子组件,使用
cachedCount
控制预加载数量 - 避免在Swiper中嵌套过多层级
- 图片轮播建议使用
objectFit
控制图片显示方式
- 对于复杂子组件,使用
-
常见问题:
- 循环模式下子组件至少需要3个才能正常显示
- 动态修改子组件数量时,建议在非动画期间进行
- 子组件设置
offset
属性时要注意层级关系
-
设计建议:
- 自动轮播时设置合适的间隔时间(3-5秒为宜)
七、API版本兼容性
Swiper组件的主要API版本支持情况:
- 基础功能:API 7+
- 数字指示器(DigitIndicator):API 10+
- 双向绑定:API 10+
- 原子化服务支持:API 11+
开发时需要注意目标设备的API版本支持情况,必要时做兼容处理。