HarmonyOS开发实战( Beta5.0)骨架屏实现案例实践

news2024/11/16 21:34:51

鸿蒙HarmonyOS开发往期必看:

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

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


介绍

本示例介绍通过骨架屏提升加载时用户体验的方法。骨架屏用于在页面数据加载完成前,先给用户展示出页面的大致结构(通常以灰色或其他浅色系的占位图形式呈现),待接口数据加载完成后,再渲染出实际页面内容并替换掉骨架屏。 通过网络接口返回的状态改变 loadingCollectedStatus 值,动态切换页面内容:初始显示骨架屏(LoadingView);成功且有数据则显示列表页(ListView);数据为空显示无数据页(NoneContentView);加载失败则显示失败页(LoadingFailedView)。

效果图预览

使用说明

  1. 进入页面开始加载,加载完成后显示整个界面。

实现思路

  1. 为了实现骨架屏的加载效果,首先自行构造一个网络JSON数据供请求使用(此处不详述具体过程)。在aboutToAppear生命周期方法中加载网络数据,并根据返回结果改变状态变量loadingCollectedStatus的值。
aboutToAppear() {
  this.loadList();
}

// 加载网络数据
loadList() {
  // 正在加载状态
  this.loadingCollectedStatus = LoadingStatus.LOADING;
  let httpRequest = http.createHttp();
  // 设置发起请求可选参数
  let options: http.HttpRequestOptions = {
    expectDataType: http.HttpDataType.OBJECT, // 可选,指定返回数据的类型
  };
  httpRequest.request(REQUEST_URL, options,
    (err: Error, data: http.HttpResponse) => {
      if (!err) {
        if (data.responseCode === CommonConstants.SUCCESS) {
          // 数据加载成功
          this.loadingCollectedStatus = LoadingStatus.SUCCESS;
          // 加载数据的处理
          this.dataSource.pushArrayData(data.result['data'] as Array<Model>)
        } else {
          // 数据加载失败
          this.loadingCollectedStatus = LoadingStatus.FAILED;
        }
      } else {
        // 数据加载失败
        this.loadingCollectedStatus = LoadingStatus.FAILED;
      }
    });
}
  1. 根据LoadingStatus的值渲染不同的页面内容:当LoadingStatus为LOADING时,显示骨架屏(LoadingView);若LoadingStatus为SUCCESS且dataSource.totalCount大于零,则显示列表页(ListView);若数据为空,则显示无数据页面(NoneContentView);若LoadingStatus为FAILED,则显示加载失败页面(LoadingFailedView)。
build() {
  Column() {
    if (this.loadingCollectedStatus === LoadingStatus.LOADING) {
      // 加载骨架屏
      LoadingView()
    } else if (this.loadingCollectedStatus === LoadingStatus.FAILED) {
      // 网络请求失败
      LoadingFailedView(() => {
        this.loadList();
      })
    } else if (this.dataSource.totalCount() === 0) {
      // 获取数据为空
      NoneContentView($r("app.media.ic_browse_no"), $r("app.string.ske_to_view"))
    } else {
      // 加载列表
      ListView({ listData: this.dataSource })
    }
  }
  .backgroundColor($r("app.color.ske_list_back_ground_color"))
  .height(CommonConstants.FULL_PERCENT)
  .width(CommonConstants.FULL_PERCENT)
}
  1. 实现与真实列表布局一致的骨架屏效果,采用如下步骤:首先,使用Row控件并设置灰色背景还原ListItem上所有的控件位置和大小,通过ForEach循环创建列表项,以此形成骨架屏的基本结构;接着,为骨架屏列表添加animateTo显示动画,这样在加载过程中,骨架屏就会呈现出闪烁的效果,从而提升用户体验。
// 骨架屏的闪烁动画
startAnimation(): void {
  animateTo(CommonConstants.SKELETON_ANIMATION, () => {
    // 动态修改骨架屏的透明度
    this.listOpacity = CommonConstants.HALF_OPACITY;
  });
}

build() {
  Row() {
    List({ space: CommonConstants.SPACE_12 }) {
      ForEach(SkeletonData, (item: SkeletonType) => {
        ListItem() {
          // 骨架屏布局
          ArticleLoadingSkeleton(item.isMine)
        }
      })
    }
    .layoutWeight(CommonConstants.LAYOUT_WEIGHT)
      .scrollBar(BarState.Off)
      .padding({
        left: $r("app.float.ske_md_padding_margin"),
        right: $r("app.float.ske_md_padding_margin")
      })
  }
  .alignItems(VerticalAlign.Top)
    .height(CommonConstants.FULL_PERCENT)
    .width(CommonConstants.FULL_PERCENT)
    .opacity(this.listOpacity)
      // 组件挂载显示后触发此回调,调用动画接口给组件添加动画。
    .onAppear(() => {
      this.startAnimation();
    })
}

高性能知识点

本示例使用了LazyForEach进行数据懒加载,LazyForEach懒加载可以通过设置cachedCount属性来指定缓存数量,同时搭配组件复用能力以达到性能最优效果。

工程结构&模块类型

skeletondiagram                                    // har类型
|---common
|   |---CommonConstants.ets                        // 常量定义 
|   |---CommonConstants.ets                        // 枚举定义
|---model
|   |---LazyDataSource.ets                         // 数据类懒加载
|   |---Model.ets                                  // 列表数据模型 
|---view
|   |---ArticleLoadingSkeleton.ets                 // 骨架屏组件 
|   |---ListView.ets                               // 列表展示页面 
|   |---LoadingFailed.ets                          // 网络加载失败展示页面
|   |---LoadingView.ets                            // 骨架屏加载页面
|   |---NoneContentView.ets                        // 空数据展示页面
|   |---ObservedArray.ets                          // 被观察数据对象包装
|   |---SkeletonDiagram.ets                        // 主页面

模块依赖

本实例依赖common模块来实现日志的打印以及路由模块来注册路由。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为体系杂乱无章,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线、视频、文档用来跟着学习是非常有必要的。

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记 希望这一份鸿蒙学习文档能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无法加载用户配置文件怎么解决?

你有没有遇到过这种问题&#xff0c;蓝屏提示“User Profile Services服务登录失败。无法加载用户配置文件”。为什么会出现问题呢&#xff1f;可能的原因包括&#xff1a; 用户配置文件损坏&#xff1a;用户的配置文件可能已损坏&#xff0c;导致系统无法读取。 权限问题&…

linux更换阿里镜像源

第一步&#xff1a;进入 /etc/yum.repos.d目录下 cd /etc/yum.repos.d 第二步&#xff1a;编辑 CentOS-Base.repo 打开该文件 vi CentOS-Base.repo 第三步&#xff1a;点击键盘i&#xff0c;进入编辑模式 删除文件的全部内容&#xff1a;将阿里下面配置复制粘贴进取 [base] nam…

Ribbon (WPF)

Ribbon (WPF) 在本文中主要包含以下内容&#xff1a; Ribbon组件和功能应用程序菜单快速访问工具栏增强的工具提示 Ribbon是一个命令栏&#xff0c;它将应用程序的功能组织到应用程序窗口顶部的一系列选项卡中。Ribbon用户界面(UI)增加了特性和功能的可发现性&#xff0c;使用…

神经网络学习笔记——如何设计、实现并训练一个标准的前馈神经网络

1.从零设计并训练一个神经网络https://www.bilibili.com/video/BV134421U77t/?spm_id_from333.337.search-card.all.click&vd_source0b1f472915ac9cb9cdccb8658d6c2e69 一、如何设计、实现并训练一个标准的前馈神经网络&#xff0c;用于手写数字图像的分类&#xff0c;重…

如何制作Vector Vflash中加载的DLL文件--自动解锁刷写过程中27服务

案例背景&#xff1a; vFlash 是一种易于使用的工具&#xff0c;用于对一个或多个 ECU 进行刷写软件。由于方法灵活&#xff0c;它可以支持各种汽车原始设备制造商的不同刷写规范。它支持通过 CAN、CAN FD、FlexRay、LIN、以太网/DoIP 和以太网/SoAd 对 ECU 进行刷写。 vFlas…

SpringSecurity原理解析(六):SecurityConfigurer 解析

1、SecurityConfigurer SecurityConfigurer 在 Spring Security 中是一个非常重要的接口&#xff0c;观察HttpSecurity 中的很多 方法可以发现&#xff0c;SpringSecurity 中的每一个过滤器都是通过 xxxConfigurer 来进行配置的&#xff0c;而 这些 xxxConfigurer 其实都是 Sec…

针对Docker容器的可视化管理工具—DockerUI

目录 ⛳️推荐 前言 1. 安装部署DockerUI 2. 安装cpolar内网穿透 3. 配置DockerUI公网访问地址 4. 公网远程访问DockerUI 5. 固定DockerUI公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

GBI(生成式商业智能)实际业务生产落地运用上的探索和实践

前言 最近在探索如何发展AI在业务上的驱动力时了解到了生成式商业智能这一概念&#xff0c;同时本人也在探索ChatBI这一技术的实际落地运用&#xff0c;其实二者几乎在实现效果层面是一个意思&#xff0c;GBI(Generative Business Intelligence)是偏向业务方面&#xff0c;而C…

[000-01-008].第05节:OpenFeign高级特性-超时控制

我的后端学习大纲 SpringCloud学习大纲 1.1.OpenFeign超时的情况&#xff1a; 在Spring Cloud微服务架构中&#xff0c;大部分公司都是利用OpenFeign进行服务间的调用&#xff0c;而比较简单的业务使用默认配置是不会有多大问题的&#xff0c;但是如果是业务比较复杂&#xff…

UiBot教程:实现复杂流程图的高效方法

在自动化测试和RPA&#xff08;机器人流程自动化&#xff09;领域&#xff0c;使用UiBot绘制复杂流程图是日常工作中常见的挑战之一。如何在繁杂的逻辑中保持高效&#xff1f;如何实现复杂流程的自动化设计而不迷失于其中&#xff1f;这是许多测试工程师和自动化开发者所面临的…

区块链之变:揭秘Web3对互联网的改变

传统游戏中&#xff0c;玩家的虚拟资产&#xff08;如角色、装备&#xff09;通常由游戏公司控制&#xff0c;玩家无法真正拥有这些资产或进行交易。而在区块链游戏中&#xff0c;虚拟资产通过去中心化技术记录在区块链上&#xff0c;玩家对其拥有完全的所有权&#xff0c;并能…

Loki 分布式日志中心服务

目录 Loki 是什么 Loki 配置文件介绍 Loki 安装 Promtail 配置文件介绍 Promtail 安装 Loki 整合 Grafana Loki 是什么 Loki 是一个专为日志聚合和查询设计的开源分布式日志管理系统&#xff0c;由 Grafana Labs 开发。它与 Prometheus 类似&#xff0c;但用于处理日志&a…

决策树实战

文章目录 一、入门基础案例二、基于sklearn的决策树模型2.1sklearn中的决策树实现2.2分类型决策树&#xff1a;DecisionTreeClassifier2.2.1重要参数2.2.2重要属性与接口2.2.3基本案例&#xff1a;wine葡萄酒数据集 2.3回归型决策树&#xff1a;DecisionTreeRegressor2.3.1重要…

大学选修课无人机航拍技术与技巧怎么样?

在当今这个视觉盛行的时代&#xff0c;无人机航拍技术以其独特的视角和非凡的创意能力&#xff0c;正逐步成为影视制作、新闻报道、地理测绘、环境监测及个人记录生活等领域不可或缺的工具。为此&#xff0c;本大学特设《无人机航拍技术与技巧》选修课&#xff0c;旨在通过系统…

Linux数据相关-第3个服务-实时同步sersync

1、实时同步 背景&#xff1a; 之前我们通过rsync 定时任务实现定时备份/同步对于NFS我们需要进行实时同步 选择 分布式存储.。使用实时同步服务NFS。选择公有云对象存储&#xff0c;七牛存储&#xff0c;腾讯存储COS 选择&#xff1a;nfs实时同步工具 inotify(bug需要书…

3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)

前言&#xff1a; 笔者尝试过很多3D标注软件都遇到很多问题&#xff0c;例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐&#xff1b;labelCloud没有三视图&#xff0c;视角难以调整标得不够精确&#xff1b;SUSTechPOINTS换帧麻烦、输出时存储在docker里面…

每日OJ_牛客_数字统计(简单模拟)

目录 牛客_数字统计&#xff08;简单模拟&#xff09; 解析代码 牛客_数字统计&#xff08;简单模拟&#xff09; [NOIP2010]数字统计_牛客题霸_牛客网 描述 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数…

sipp模拟uas发送reinvite

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在更新了sipp模拟update的配置方案之后&#xff0c;我希望对比一下fs对update和reinvite的处理流程。 本文档记录sipp的配置方案&#xff0c;该方案中包含了update和reinvite的信令。 环境 CentOS 7.9 freeswitch 1…

Linux入门攻坚——32、Mini Linux制作

制作一个mini linux&#xff0c;需要对linux的启动流程很熟悉&#xff0c;这里又一次学习Linux的启动过程。 启动流程&#xff1a;CentOS 6 / 5&#xff1a; POST -->BootSequence(BIOS) --> BootLoader --> kernel (ramdisk) --> rootfs --> /sbin/init …

MySQL——数据类型(二)

目录 一、日期与时间类型 1.1 date 1.2 datetime 1.3 timestamp 二、枚举和联合 2.1 enum 2.2 set 2.2.1 set 的插入 2.2.2 set 的查找 思维导图可以参考如下链接&#xff1a; 数据类型.xmind 夜夜亮晶晶/MySQL - Gitee.com 一、日期与时间类型 1.1 date 日期 yyy…