介绍
在很多应用中,swiper组件每一个page的高度是不一致的,所以需要swiper组件下方页面的高度跟着一起变化。
效果图预览

使用说明
向左滑动swiper组件,上方swiper组件高度变高,下方页面随着swiper的变化而平滑的变化。
实现思路
实现方案如下:
- 生成四个Swiper页面,来进行左右滑动,GridBuilderFunction是生成Swiper的page。
 
Swiper() {Column() {Stack() {Text('功能栏').textAlign(TextAlign.Center).margin({ top: $r('app.integer.margin_small'), left: $r('app.integer.default_padding') })// swiper第一个pagethis.GridBuilderFunction(this.dataPageOne, Const.GRID_DOUBLE_HEIGHT, Const.GRID_TEMPLATE)}.alignContent(Alignment.TopStart)}// swiper第二个pagethis.GridBuilderFunction(this.dataPageTwo, Const.GRID_DOUBLE_HEIGHT, Const.GRID_TEMPLATE)// swiper第三个pagethis.GridBuilderFunction(this.dataPageThree, Const.GRID_DOUBLE_HEIGHT, Const.GRID_TEMPLATE)// swiper第四个pagethis.GridBuilderFunction(this.dataPageFour, Const.GRID_DOUBLE_HEIGHT, Const.GRID_TEMPLATE)
}
 
- Swiper组件的回调,通过左右滑动的距离来计算对应的上下位置的变化,在页面跟手滑动过程中,逐帧触发onGestureSwipe回调,swiperDistance发生变化。
 
Swiper{...
}
.onGestureSwipe((index: number, extraInfo: SwiperAnimationEvent) => {animateTo({duration: Const.DURATION,curve: Curve.EaseOut,playMode: PlayMode.Normal,onFinish: () => {logger.info('play end');}}, () => { // 通过左右滑动的距离来计算对应的上下位置的变化if (index === 0 && extraInfo.currentOffset < 0) {this.swiperDistance = extraInfo.currentOffset / Const.SCROLL_WIDTH * Const.SMALL_FONT_SIZE;} else if (index === 1 && extraInfo.currentOffset > 0) {this.swiperDistance = extraInfo.currentOffset / Const.SCROLL_WIDTH * Const.SMALL_FONT_SIZE - Const.SMALL_FONT_SIZE;} else if (index === 2 && extraInfo.currentOffset < 0) {this.swiperDistance = extraInfo.currentOffset / Const.SCROLL_WIDTH * Const.GRID_SINGLE_HEIGHT - Const.SMALL_FONT_SIZE;} else if (index === 3 && extraInfo.currentOffset > 0) {this.swiperDistance = extraInfo.currentOffset / Const.SCROLL_WIDTH * Const.GRID_SINGLE_HEIGHT - Const.SMALL_FONT_SIZE - Const.GRID_SINGLE_HEIGHT;}})
})
 
- Swiper组件的回调,用来达到平滑变化的效果,切换动画开始时触发onAnimationStart回调。
 
Swiper{...
}
.onAnimationStart((_: number, targetIndex: number) => {animateTo({duration: Const.DURATION,curve: Curve.EaseOut,playMode: PlayMode.Normal,onFinish: () => {logger.info('play end');}}, () => {if (targetIndex === 0) {this.swiperDistance = 0;} else if (targetIndex === 1 || targetIndex === 2) {this.swiperDistance = -Const.SMALL_FONT_SIZE;} else {this.swiperDistance = -Const.SMALL_FONT_SIZE - Const.GRID_SINGLE_HEIGHT;}})
})
 
高性能知识点
- 本例中swiper组件绑定onGestureSwipe回调,该回调为逐帧回调函数,避免在回调内部使用冗余和耗时操作。
 - 本例中Text绑定visibility属性方法,进而控制组件的显隐状态,避免组件的频繁创建与销毁,提升性能。
 
工程结构&模块类型
   swipersmoothvariation                // har包|---common|   |---CommonConstants.ets          // 提供自定义数据    |---pages|   |---MainPage.ets                 // 滑动变化效果实现页面
 
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
 
- 基本概念
 - 构建第一个ArkTS应用
 - ……
 

开发基础知识:https://qr21.cn/FV7h05
 
- 应用基础知识
 - 配置文件
 - 应用数据管理
 - 应用安全管理
 - 应用隐私保护
 - 三方应用调用管控机制
 - 资源分类与访问
 - 学习ArkTS语言
 - ……
 

基于ArkTS 开发:https://qr21.cn/FV7h05
 
- Ability开发
 - UI开发
 - 公共事件与通知
 - 窗口管理
 - 媒体
 - 安全
 - 网络与链接
 - 电话服务
 - 数据管理
 - 后台任务(Background Task)管理
 - 设备管理
 - 设备使用信息统计
 - DFX
 - 国际化开发
 - 折叠屏系列
 - ……
 

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
 

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
 
1.项目开发必备面试题
 2.性能优化方向
 3.架构方向
 4.鸿蒙开发系统底层方向
 5.鸿蒙音视频开发方向
 6.鸿蒙车载开发方向
 7.鸿蒙南向开发方向
