• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 页面加载效果实现案例
2
3### 介绍
4
5本示例介绍Stack堆叠组件和LoadingProgress加载组件模拟首次进入页面实现页面加载的效果。加载完成后,LoadingProgress组件会消失并展示加载结果页(即商品页)。
6
7### 效果图预览
8
9![](pageloading/src/main/resources/base/media/page_loading.gif)
10
11**使用说明**
12
131. 进入页面开始加载,加载完成后显示整个界面。
14
15### 实现思路
16
171. 为了实现在页面初次加载时即展现出加载提示效果,预先定义了一个布尔类型的变量isLoading,并将其初始值设定为true。在页面加载初期,这一变量状态将触发加载页的显现,传达数据正在加载的即时信息。
18```javascript
19build() {
20  Stack() {
21    if (this.isLoading) {
22      // 加载页
23      LoadingHUD();
24    } else {
25      // 商品页
26      CommodityList();
27    }
28  }
29  .width('100%')
30  .height('100%')
31  .backgroundColor(Color.White)
32}
33```
342. 使用Canvas播放lottie动画以及Progress组件实现进度条
35```javascript
36Canvas(this.politeChickyController)
37  .width($r('app.integer.lottie_view_canvas_size'))
38  .height($r('app.integer.lottie_view_canvas_size'))
39  .borderRadius($r('app.string.ohos_id_corner_radius_default_m'))
40  .onReady(() => {
41    // TODO:知识点:必须要Canvas组件初始化之后才能执行lottie.loadAnimation方法去加载动画。
42    this.initAnimation();
43  })
44Row() {
45  Progress({ value: this.nowProgress, total: 100, type: ProgressType.Linear })
46    .style({ strokeWidth: 10, enableSmoothEffect: true })
47    .color(this.gradientColor)
48}
49.width('60%')
50.margin({ top: $r('app.integer.lottie_view_canvas_height') })
51```
523. 为了模拟真实的网络加载情景,设置了5秒的延迟加载机制。在页面初次加载后的5秒钟内,isLoading变量保持为true,保持加载页的展示。当5秒时限到达时,将isLoading变量的值更新为false,代表加载状态的loadingHUD将会消失,真正的加载结果CommodityList商品列表页面便会呈现出来。
53```javascript
54aboutToAppear(): void {
55  // 模拟网络请求操作,请求网络3秒后得到数据,通知组件,变更列表数据
56  setTimeout(() => {
57    this.isLoading = false;
58  }, MILLISECONDS);
59}
60```
614. CommodityList商品列表页面采用[RelativeContainer](pageloading/src/main/ets/view/CommodityList.ets)相对布局组件,容器内子组件区分水平方向,垂直方向,子组件可以将容器或者其他子组件设为锚点。
62```javascript
63RelativeContainer() {
64  // 商品图片
65  Image(item.uri)
66    ...
67  .alignRules({
68    top: { anchor: '__container__', align: VerticalAlign.Top },
69    left: { anchor: '__container__', align: HorizontalAlign.Start }
70  })
71  .id('image')
72  // 保价标签
73  Text(item.insurance)
74    ...
75  .alignRules({
76    right: { anchor: '__container__', align: HorizontalAlign.End },
77    center: { anchor: '__container__', align: VerticalAlign.Center }
78  })
79  .id('insurance')
80  // 浏览量
81  Row() {
82    Image($r('app.media.page_loading_views'))
83      ...
84    Text(item.views)
85      ...
86  }
87  .alignRules({
88    middle: { anchor: 'insurance', align: HorizontalAlign.Center },
89    top: { anchor: 'insurance', align: VerticalAlign.Bottom }
90  })
91  .id('views')
92  // 标题和价格标签
93  Column() {
94    Text(item.title)
95      ...
96    Text(item.price)
97      ...
98  }
99  .alignRules({
100    left: { anchor: 'image', align: HorizontalAlign.End },
101    right: { anchor: 'insurance', align: HorizontalAlign.Start },
102    center: { anchor: 'image', align: VerticalAlign.Center }
103  })
104  .id('column')
105}
106
107```
108
109### 高性能知识点
110
111本示例使用了[LazyForEach](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-rendering-control-lazyforeach.md)进行数据懒加载,LazyForEach懒加载可以通过设置cachedCount属性来指定缓存数量,同时搭配[组件复用](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/performance/component-reuse-overview.md)能力以达到性能最优效果。
112
113### 工程结构&模块类型
114
115```
116pageloading                                      // har类型
117|---mock
118|   |---CommodityMock.ets                        // 本地数据源
119|---model
120|   |---CommodityDataModel.ets                   // 数据类型定义
121|   |---CommodityDataSource.ets                  // 列表数据模型
122|---view
123|   |---CommodityList.ets                        // 商品列表自定义组件
124|   |---LoadingHUD.ets                           // 加载自定义组件
125|   |---PageLoading.ets                          // 主页面
126```
127
128### 模块依赖
129
130不涉及
131
132### 参考资料
133
134[Stack](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-stack.md)
135
136[Progress](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-basic-components-progress.md)
137
138[RelativeContainer](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-relativecontainer.md)
139
140### 相关权限
141
142不涉及
143
144### 约束与限制
145
1461.本示例仅支持在标准系统上运行,支持设备:RK3568。
147
1482.本示例为Stage模型,支持API12版本SDK,SDK版本号(API Version 12 Release)。
149
1503.本示例需要使用DevEco Studio 5.0.0 Release 才可编译运行。
151
152### 下载
153
154如需单独下载本工程,执行如下命令:
155```javascript
156git init
157git config core.sparsecheckout true
158echo code/UI/PageLoading/ > .git/info/sparse-checkout
159git remote add origin https://gitee.com/openharmony/applications_app_samples.git
160git pull origin master
161```
162
163
164