• 【ARK UI】HarmonyOS ETS的启动页的实现


     参考资料

     

    页面路由

    轻量级存储

    【ARK UI】HarmonyOS ETS的引导页的实现

    代码实现

    1、功能描述

    打开一个应用程序时,会有一个类似欢迎的界面,它叫SplashPages。

    一般在这个页面可以做一些App数据初始化的工作。

    实现的效果当用户点击App icon后,进入SplashActivity,大约经过1~2秒跳转到程序的主界面。

    2、思路

    逻辑首先页面启动的时候进入SplashPage界面,
    然后在页面启动的时候获取IsFirst的key的value值
    如果IsFirst的key的value值为true,就认为他是第一次进入,那么进入欢迎页面
    如果IsFirst的key的value值为false,就认为他是多次进入,那么就进入主页面
    然后在欢迎页面的点击按钮实现 如果点击了按钮则判断他下次进入为多次进入这个界面了,
    那么我们需要把IsFirst的key的value值修改为false

    3、SplashPage界面

    1. import dataStorage from '@ohos.data.storage'
    2. import featureAbility from '@ohos.ability.featureAbility'
    3. import router from '@system.router';
    4. @Entry
    5. @Component
    6. struct SplashPage {
    7. @State IsFirstValue:boolean=true;
    8. /**
    9. * 逻辑首先页面启动的时候进入SplashPage界面,
    10. * 然后在页面启动的时候获取IsFirst的key的value值
    11. * 如果IsFirst的key的value值为true,就认为他是第一次进入,那么进入欢迎页面
    12. * 如果IsFirst的key的value值为false,就认为他是多次进入,那么就进入主页面
    13. * 然后在欢迎页面的点击按钮实现 如果点击了按钮则判断他下次进入为多次进入这个界面了,
    14. * 那么我们需要把IsFirst的key的value值修改为false
    15. */
    16. public aboutToAppear(){
    17. console.log("aboutToDisappear")
    18. var timeoutID = setTimeout(function() {//todo 延迟5 为了显示启动页面
    19. console.log('delay 1s');
    20. //todo 获取 path路径
    21. var context = featureAbility.getContext()
    22. context.getFilesDir((err, path) => {
    23. if (err) {
    24. console.error('getFilesDir failed. err: ' + JSON.stringify(err));
    25. return;
    26. }
    27. console.info('getFilesDir successful. path:' + JSON.stringify(path));
    28. //todo 获取 storage 对象
    29. let storage = dataStorage.getStorageSync(path + '/mystore')
    30. let IsFirst = storage.getSync('isFirst', true)//todo 获取 是否第一次启动
    31. console.log("IsFirst=====>"+JSON.stringify(IsFirst))
    32. if(IsFirst){// todo 如果是的话 跳转到欢迎页面
    33. router.replace({
    34. uri:"pages/WelcomePage"
    35. })
    36. }else{//TODO 如果不是的话 跳转到主界面
    37. router.replace({
    38. uri:"pages/index"
    39. })
    40. }
    41. });
    42. }, 2000);
    43. }
    44. build() {
    45. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
    46. Stack({ alignContent: Alignment.Center }){
    47. Image($r("app.media.icon")).width(100).height(100)
    48. Text("启动页界面").fontSize(20).fontColor(Color.White).margin({top:150})
    49. }.width('100%').height("100%").backgroundColor(Color.Green).align(Alignment.Center)
    50. }
    51. .width('100%')
    52. .height('100%')
    53. }
    54. }

    4、主界面

    1. @Entry
    2. @Component
    3. struct Index {
    4. build() {
    5. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
    6. Text('这是一个主界面')
    7. .fontSize(50)
    8. .fontWeight(FontWeight.Bold)
    9. }
    10. .width('100%')
    11. .height('100%')
    12. }
    13. }

    5、欢迎界面

    欢迎界面我们可以参考之前的资料,我们需要在按钮点击事件,修改一下IsFirst修改为false,代表下次进去是多次进入

    1. import router from '@system.router';
    2. import dataStorage from '@ohos.data.storage'
    3. import featureAbility from '@ohos.ability.featureAbility'
    4. @Entry
    5. @Component
    6. struct WelcomePage {
    7. private swiperController: SwiperController = new SwiperController()
    8. /**
    9. * 控制启动按钮显示还是隐藏
    10. */
    11. @State flag: boolean= false;
    12. build() {
    13. Column({ space: 5 }) {
    14. Stack({ alignContent: Alignment.TopEnd }) {
    15. Swiper(this.swiperController) {
    16. //todo 引导页图片内容
    17. //todo 引导页一
    18. Stack({ alignContent: Alignment.Center }){
    19. Image($r("app.media.icon")).width(100).height(100)
    20. Text("引导页一").fontSize(20).fontColor(Color.White).margin({top:150})
    21. }.width('100%').height("100%").backgroundColor(Color.Red).align(Alignment.Center)
    22. //todo 引导页 二
    23. Stack({ alignContent: Alignment.Center }){
    24. Image($r("app.media.icon")).width(100).height(100)
    25. Text("引导页二").fontSize(20).fontColor(Color.White).margin({top:150})
    26. }.width('100%').height("100%").backgroundColor(Color.Orange).align(Alignment.Center)
    27. //todo 引导页三
    28. Stack({ alignContent: Alignment.Center }){
    29. Image($r("app.media.icon")).width(100).height(100)
    30. Text("引导页三").fontSize(20).fontColor(Color.White).margin({top:150})
    31. }.width('100%').height("100%").backgroundColor(Color.Green).align(Alignment.Center)
    32. }
    33. .index(0) //todo 当前索引为0 开始
    34. .autoPlay(false) //todo 停止自动播放
    35. .indicator(true) // todo 默认开启指示点
    36. .loop(false) // todo 停止自动播放 默认开启循环播放
    37. .vertical(false) //todo 横向切换 默认横向切换
    38. .onChange((index: number) => {
    39. /**
    40. * 根据Index 进行判断 当引导页播放到最后一个页面时候
    41. * 让启动按钮显示 否则的话 不显示
    42. */
    43. if (index == 2) { //todo 最后一个 设置flag 为true
    44. this.flag = true
    45. } else { //todo 不是最后一个 设置flag为false
    46. this.flag = false
    47. }
    48. })
    49. if (this.flag) //todo 当flag 为true 则显示启动按钮 为false的时候不显示
    50. Text('启动')
    51. .width('300px')
    52. .height('150px')
    53. .textAlign(TextAlign.Center)
    54. .fontSize(20)
    55. .backgroundColor(Color.White)
    56. .margin({ right: 20, top: 20 })
    57. .onClick(function () { //todo 实现按钮点击事件 进入到主界面
    58. //todo 获取 path 对象
    59. var context = featureAbility.getContext()
    60. context.getFilesDir((err, path) => {
    61. if (err) {
    62. console.error('getFilesDir failed. err: ' + JSON.stringify(err));
    63. return;
    64. }
    65. console.info('getFilesDir successful. path:' + JSON.stringify(path));
    66. //todo 获取 storage 对象
    67. let storage = dataStorage.getStorageSync(path + '/mystore')
    68. storage.putSync('isFirst', false)
    69. storage.flushSync()
    70. let IsFirst = storage.getSync('isFirst', true) //todo 获取 是否第一次启动
    71. console.log("IsFirst=====>" + JSON.stringify(IsFirst))
    72. //todo 存储成功 跳转主界面
    73. router.replace({
    74. uri: "pages/index"
    75. })
    76. })
    77. })
    78. }
    79. }
    80. }
    81. }

    运行效果

    更多鸿蒙资料可参考:华为开发者论坛

  • 相关阅读:
    弘君资本今日投资参考:新能源消纳政策加码 智能网联汽车再加速
    Kubernetes 系统化学习之 资源清单篇(三)
    [NOIP2000 提高组]-乘积最大:隔板法-DFS搜索-Go语言
    如何辨认是否是高防服务器?
    【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
    罗丹明 PEG 巯基,Rhodamine PEG Thiol,荧光染料标记巯基/硫醇
    手撕红黑树
    通信算法之九十六:电力通信系统-HRF多载波通信系统-物理层收发信道开发
    42_综合案例——发红包【界面版】
    深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/125504647