首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS鸿蒙开发实战( Beta5.0)长列表滑动到指定列表项动效实现实践案例

  • 25-03-03 06:42
  • 3817
  • 5669
blog.csdn.net

鸿蒙HarmonyOS NEXT开发实战往期文章必看(持续更新......)

HarmonyOS NEXT应用开发性能实践总结

HarmonyOS NEXT应用开发案例实践总结合集

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!


介绍

在长列表场景时,当用户在浏览过程中打断时,列表会从第一项开始重新加载,此时我们使用scrollToIndex跳转到某个列表项时,当开启smooth动效时,会对经过的所有item进行加载和布局计算,当大量加载item时会导致性能问题,影响用户体验。因此我们使用currentOffset方法获取并记录偏移量,然后使用scrollTo方法跳转到上次浏览记录功能,可以流畅滑动到上次列表的位置。

效果图预览

使用说明

  1. 进入页面,第一次点击跳转到上次浏览记录,由于第一次没有记录,所以滑动到固定1000vp的位置。
  2. 此时按钮变成跳转到顶部,再次点击按钮,列表滑动到顶部,并同时记录上一次的位置坐标。
  3. 此时按钮变回为跳转到上次浏览记录,点击按钮,观察到列表流畅滑动到上次浏览位置。

实现思路

本例涉及的关键特性和实现方案如下:

  1. 使用LazyForEach+cachedCount+@Reusable实现懒加载列表,并且缓存附近组件。源码参考ListSlideToHistory.ets和OneMoment.ets。

    1. List({ space: ListConstants.LIST_SPACE, scroller: this.listScroller }) {
    2. LazyForEach(momentData, (moment: FriendMoment) => {
    3. ListItem() {
    4. OneMoment({ moment: moment })
    5. }
    6. }, (moment: FriendMoment) => moment.id)
    7. }
    8. .cachedCount(this.cachedCountNumber)
    9. .width($r('app.string.list_slide_to_history_layout_100'))
    10. .height($r('app.string.list_slide_to_history_layout_100'))
    11. .listDirection(Axis.Vertical)
    12. .divider({
    13. strokeWidth: $r('app.integer.list_slide_to_history_divider_width'),
    14. color: $r('app.color.list_slide_to_history_divider_color'),
    15. startMargin: $r('app.integer.list_slide_to_history_list_divider_margin'),
    16. endMargin: $r('app.integer.list_slide_to_history_list_divider_margin')
    17. })
    18. .onScrollIndex((first: number) => {
    19. this.firstIndex = first;
    20. })
  2. 在页面返回/退出等需要历史记录的地方,使用currentOffset方法来获取当前偏移量并存储到本地,本例在跳转到Top时将偏移量记录到成员变量historyOffset中。源码参考ListSlideToHistory.ets。

    this.historyOffset = this.listScroller.currentOffset().yOffset;
    
  3. 在跳转时,使用scrollTo+animation动画实现列表滑动。源码参考ListSlideToHistory.ets。

    1. this.listScroller.scrollTo({
    2. xOffset: 0,
    3. yOffset: this.historyOffset === 0 ? this.DEFAULT_OFFSET : this.historyOffset,
    4. animation: { duration: this.ANIMATION_DURATION, curve: Curve.LinearOutSlowIn }
    5. })

高性能知识点

  1. 参考了长列表加载性能优化,使用了里面的LazyForEach+cacheCount+@Reusable实现长列表不卡顿滑动。
  2. 参考了Scroller,使用了currentOffset计算偏移量和scrollTo+animation动效流畅滑动来代替scrollToIndex,因为scrollToIndex在长列表场景开启smooth动效时会导致卡顿。

工程结构&模块类型

  1. listslidetohistory // har包
  2. |---constants
  3. | |---ListConstants // 列表常量
  4. |---model
  5. | |---BasicDataSource // 列表LazyForEach数据类 + 图文数据类
  6. |---view
  7. | |---components
  8. | | |---ImageText // 图标+文字组件
  9. | | |---OneMoment // 列表内图文混排组件
  10. | |---ListSlideToHistory // 附近的人列表

鸿蒙NEXT全套学习资料
微信名片
注:本文转载自blog.csdn.net的让开,我要吃人了的文章"https://blog.csdn.net/weixin_55362248/article/details/142554268"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top