HarmonyOS《柚兔学伴》项目实战06-闪屏页与动画

发布时间:2026/8/30 22:02:59

HarmonyOS《柚兔学伴》项目实战06-闪屏页与动画
06 闪屏页与动画闪屏页Splash Screen是应用启动后的第一个页面承担着品牌展示、资源预加载和页面跳转的职责。本文将围绕「柚兔学伴」项目的SplashPage.ets和SplashViewModel.ets讲解如何利用 ArkUI 的页面生命周期、animateTo全局动画 API 以及事件驱动的 ViewModel 架构来构建一个完整的闪屏页。1. SplashPage 整体结构SplashPage使用EntryComponent装饰器声明为页面入口组件import{ConfigurationConstant}fromkit.AbilityKit;import{CommonConstants,Logger,PageContext,WindowUtil}fromcommon;import{SplashEventTypeEnum,SplashViewModel}from../viewmodel/SplashViewModel;EntryComponentstruct SplashPage{privatepageContext:PageContextAppStorage.get(pageContext)asPageContext;privateappPathInfo:NavPathStackthis.pageContext.navPathStack;privateviewModel:SplashViewModelnewSplashViewModel();// ...}关键点Entry将该组件标记为页面路由入口框架会自动注册路由表。PageContext从AppStorage获取全局页面上下文其中包含NavPathStack导航栈用于页面跳转。SplashViewModel事件驱动的 ViewModel 实例负责处理业务逻辑。2. 页面生命周期与动画流程闪屏页的核心逻辑集中在aboutToAppear生命周期回调中aboutToAppear():void{WindowUtil.updateStatusBarColor(getContext(this),true);this.viewModel.sendEvent(SplashEventTypeEnum.CHECK_FIRST_START);animateTo({delay:CommonConstants.ANIMATION_DELAY,duration:CommonConstants.ANIMATION_DURATION,onFinish:(){this.viewModel.sendEvent(SplashEventTypeEnum.JUMP_TO_MAIN);}},(){this.viewModel.sendEvent(SplashEventTypeEnum.PRELOAD_RESOURCES);})}2.1 执行时序页面加载后按照以下时序依次执行更新状态栏颜色——WindowUtil.updateStatusBarColor传入true表示使用浅色状态栏白底黑字以匹配闪屏背景。检查首次启动——发送CHECK_FIRST_START事件ViewModel 判断是否首次打开应用并记录标记。启动动画——调用animateTo在动画闭包中发送PRELOAD_RESOURCES事件预加载资源。动画结束跳转——onFinish回调中发送JUMP_TO_MAIN事件导航到主页。2.2 animateTo 全局动画 APIanimateTo是 ArkUI 提供的全局隐式动画接口签名如下animateTo(value:AnimateParam,task:()void):void参数说明value动画参数对象包含duration、delay、curve、onFinish等task动画闭包闭包内触发的属性变化会自动以动画形式过渡在本项目中delay: CommonConstants.ANIMATION_DELAY500ms——延迟启动确保页面渲染完毕。duration: CommonConstants.ANIMATION_DURATION1000ms——动画持续时长。onFinish——动画完成后的回调用于触发页面跳转。注意animateTo内的闭包应当只包含 UI 属性修改。如果只需延时执行逻辑而不涉及 UI 属性动画也可以考虑使用setTimeout替代。本项目中闭包内调用PRELOAD_RESOURCES事件是在动画期间并行执行预加载任务。3. 事件驱动的 ViewModelSplashViewModel继承自BaseVMBaseState采用事件驱动架构3.1 BaseVM 抽象基类// common/src/main/ets/viewmodel/BaseVM.etsexportabstractclassBaseVMTextendsBaseState{protectedstate:T;publicconstructor(initialState:T){this.stateinitialState;}getState():T{returnthis.state;}publicabstractsendEvent(baseVMEvent:BaseVMEvent);}设计要点泛型T extends BaseState每个 ViewModel 可以定义自己的状态类型。sendEvent抽象方法子类必须实现通过事件类型分发到不同的处理方法。getState暴露当前状态给 UI 层读取。3.2 SplashViewModel 实现exportclassSplashViewModelextendsBaseVMBaseState{privatepageContext:PageContextAppStorage.get(pageContext)asPageContext;privatepreferenceManager:PreferenceManagerPreferenceManager.getInstance();publicconstructor(){super(newBaseState());}publicsendEvent(eventType:SplashEventTypeEnum):void{if(eventTypeSplashEventTypeEnum.JUMP_TO_MAIN){this.jumpToMainPage();}elseif(eventTypeSplashEventTypeEnum.PRELOAD_RESOURCES){this.preloadResources();}elseif(eventTypeSplashEventTypeEnum.CHECK_FIRST_START){this.checkIsFirstStart();}}}3.3 事件枚举exportenumSplashEventTypeEnum{JUMP_TO_MAINjumpToMainPage,PRELOAD_RESOURCESpreloadResources,CHECK_FIRST_STARTcheckIsFirstStart,}使用枚举而非硬编码字符串确保事件名的类型安全和可维护性。3.4 具体事件处理跳转到主页privatejumpToMainPage():void{this.pageContext.replacePage({routerName:MainPage,});}使用replacePage而非pushPage意味着闪屏页会从导航栈中移除用户无法返回闪屏页。检查首次启动privatecheckIsFirstStart():void{this.preferenceManager.hasValue(isFirstStart).then((hasResult:boolean){if(hasResult){Logger.info(TAG,Not first startup.);}else{Logger.info(TAG,First startup.);this.preferenceManager.setValue(isFirstStart,false).then((){Logger.info(TAG,Put the value of startup Successfully.);}).catch((err:BusinessError){Logger.error(TAG,Put the value of startup Failed, err code:${err.code});});}});}通过PreferenceManager持久化存储首次启动标记基于ohos.data.preferences实现。4. UI 构建Navigation 与背景图build(){Navigation(this.appPathInfo){Column().width(100%).height(100%).backgroundImage($r(app.media.ic_splash)).backgroundImageSize({width:100%,height:100%})}.hideTitleBar(true).mode(NavigationMode.Stack).height(100%).width(100%)}4.1 Navigation 容器Navigation(this.appPathInfo)绑定NavPathStack导航栈支持页面路由。.hideTitleBar(true)隐藏标题栏闪屏页需要全屏展示。.mode(NavigationMode.Stack)使用栈管理模式支持pushPage/replacePage等路由操作。4.2 背景图$r(app.media.ic_splash)引用resources/base/media/ic_splash资源这是 ArkUI 的资源引用语法$r(app.type.name)。backgroundImageSize设为{ width: 100%, height: 100% }确保图片铺满整个容器。5. onPageHide状态栏颜色恢复当用户离开闪屏页跳转到主页后需要将状态栏颜色恢复为与系统深浅色模式匹配onPageHide(){Logger.info(TAG,onPageHide);WindowUtil.updateStatusBarColor(getContext(this),AppStorage.get(systemColorMode)ConfigurationConstant.ColorMode.COLOR_MODE_DARK);}onPageHide页面隐藏时的生命周期回调。AppStorage.get(systemColorMode)从全局存储读取当前颜色模式。当系统为深色模式时传入true浅色状态栏否则传入false深色状态栏。6. 总结知识点说明EntryComponent页面入口组件声明aboutToAppear页面出现前回调适合初始化逻辑animateTo全局隐式动画 API支持 delay/duration/onFinishBaseVMT抽象 ViewModel 基类事件驱动架构sendEvent 枚举类型安全的事件分发机制NavigationNavPathStack声明式导航与路由栈管理$r()资源引用语法访问 media/string/color 资源onPageHide页面隐藏回调用于资源清理或状态恢复PreferenceManager轻量级键值对持久化存储闪屏页看似简单却串联了 ArkUI 的页面生命周期、动画系统、导航框架和 ViewModel 架构等多个核心概念。掌握这些模式将为后续复杂页面的开发打下坚实基础。

相关新闻

如何免费获取8大网盘直链下载地址:终极完整指南

如何免费获取8大网盘直链下载地址:终极完整指南

2026/8/26 1:20:05

如何免费获取8大网盘直链下载地址:终极完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 /…

开发者必看:Kimi-K2.5-MXFP4-AttnFP8模型文件结构与权重加载逻辑

开发者必看:Kimi-K2.5-MXFP4-AttnFP8模型文件结构与权重加载逻辑

2026/8/24 13:00:02

开发者必看:Kimi-K2.5-MXFP4-AttnFP8模型文件结构与权重加载逻辑 【免费下载链接】Kimi-K2.5-MXFP4-AttnFP8 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Kimi-K2.5-MXFP4-AttnFP8 想要高效部署和优化Kimi-K2.5-MXFP4-AttnFP8模型?了解其文…

抖音下载神器:douyin-downloader终极指南,让珍贵内容永不丢失

抖音下载神器:douyin-downloader终极指南,让珍贵内容永不丢失

2026/8/27 2:05:16

抖音下载神器:douyin-downloader终极指南,让珍贵内容永不丢失 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and brow…

元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第六十四篇 高轨星座轻量化星上交换拓扑内核

元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第六十四篇 高轨星座轻量化星上交换拓扑内核

2026/8/30 22:02:22

第六十四篇 高轨星座轻量化星上交换拓扑内核承启前置 篇章立论前文第六十三篇完成极端地磁扰动下高轨链路稳态拓扑体系定型,通过静态结界隔离、动态拓扑重构、三层圈层兜底、全域时序补偿四大核心体系,彻底解决高轨星座在极端空间环境下的链路失稳、组网…

(强化学习(1)——Q-learning算法原理与Python实现

(强化学习(1)——Q-learning算法原理与Python实现

2026/8/30 22:02:21

强化学习是机器学习中一个非常重要的分支,它与监督学习和无监督学习并列为三大学习范式。这篇博客开始系统学习强化学习,从最基础的Q-learning算法入手,在实战中掌握强化学习的核心思想。 强化学习(1)——Q-learning算…

零基础学Python:用500集教程构建你的爬虫、数据分析与自动化办公学习路线

零基础学Python:用500集教程构建你的爬虫、数据分析与自动化办公学习路线

2026/8/30 22:02:21

最近很多人都在问,零基础学Python是不是有一套教程就够了。正好最近这套流传很广的“500集Python零基础全套教程”被聊得很多,我也花时间把它覆盖的内容、学习顺序和实际落地难度重新梳理了一遍。它最值得关注的地方,不是“集数多”&#xff…

Transformer教程“从娶到删”:核心原理与PyTorch实战

Transformer教程“从娶到删”:核心原理与PyTorch实战

2026/8/30 22:02:21

如果把学 Transformer 比作一场单方面恋爱,那我们的处境大概是:明明看了十几篇教程,收藏夹塞得满满当当,第二天睁开眼睛,连 Multi-Head Attention 里的 Q、K、V 谁是谁都记不清。这不是你的问题,而是市面上…

Java基础--函数式编程(lambda)

Java基础--函数式编程(lambda)

2026/8/30 22:02:21

lambda表达式:使用lambda函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好注意:lambda表达式并不是可以简化全部的匿名内部类,lambda只能替代函数式接口的匿名内部类函数式接口:有且仅有一个抽…

模型能力之外的工程中间层:AI应用稳定落地的关键

模型能力之外的工程中间层:AI应用稳定落地的关键

2026/8/30 21:52:21

我最近在帮一个团队梳理AI应用项目时,遇到一个很有代表性的现象。界面上,整个流程已经跑通了,模型在精心挑选的十几个测试样例上也表现得很漂亮。可是一旦接进真实业务,问题就接踵而来:有的请求超时,有的输…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…