1# 页面加载效果实现案例 2 3### 介绍 4 5本示例介绍Stack堆叠组件和LoadingProgress加载组件模拟首次进入页面实现页面加载的效果。加载完成后,LoadingProgress组件会消失并展示加载结果页(即商品页)。 6 7### 效果图预览 8 9 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