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

发布时间:2026/7/11 13:52:58

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/7/11 13:42:57

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

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

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

2026/7/11 13:42:57

开发者必看: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/7/11 13:42:57

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

CloudExplorer Lite监控告警系统:实时监控云资源状态与异常检测

CloudExplorer Lite监控告警系统:实时监控云资源状态与异常检测

2026/7/11 15:23:01

CloudExplorer Lite监控告警系统:实时监控云资源状态与异常检测 【免费下载链接】CloudExplorer 开源的轻量级云管平台 项目地址: https://gitcode.com/gh_mirrors/cl/CloudExplorer CloudExplorer Lite作为开源轻量级云管平台,其内置的监控告警系…

INT8、FP8、MXFP8:8位量化格式技术解析与CUDA环境配置指南

INT8、FP8、MXFP8:8位量化格式技术解析与CUDA环境配置指南

2026/7/11 15:23:01

随着AI模型规模的爆炸式增长,模型推理和训练的资源消耗已成为开发者面临的核心挑战。最近,Bernini导演台正式宣布支持int8量化模型,这意味着开发者在选择低精度推理方案时又多了一个重要选项。但面对int8、mxfp8、fp8这三种主流的8位精度格式…

戴森球计划终极工厂蓝图库:3000+设计让你从新手秒变建造大师![特殊字符]

戴森球计划终极工厂蓝图库:3000+设计让你从新手秒变建造大师![特殊字符]

2026/7/11 15:23:01

戴森球计划终极工厂蓝图库:3000设计让你从新手秒变建造大师!🚀 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 还在为《戴森球计划》中复…

无接触心率捕捉

无接触心率捕捉

2026/7/11 15:23:01

痛点引入:传统心率监测的困扰 在健康意识日益增强的当下,越来越多的人开始关注自己的心率健康。然而,传统的心率监测方式,如佩戴手环或粘贴传感器,存在诸多不便。手环佩戴起来可能会有束缚感,影响睡眠质量…

洛雪音乐开源音源终极指南:如何免费获取全网无损音乐

洛雪音乐开源音源终极指南:如何免费获取全网无损音乐

2026/7/11 15:23:01

洛雪音乐开源音源终极指南:如何免费获取全网无损音乐 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 还在为音乐会员费烦恼吗?想要一次性畅听酷我、酷狗、QQ音乐、网易云音…

工业信号隔离与抗干扰:FOD4216光耦与STM32应用

工业信号隔离与抗干扰:FOD4216光耦与STM32应用

2026/7/11 15:13:01

1. 工业环境中的信号干扰挑战 在电机控制、PLC系统或工业自动化设备中,信号传输面临三大典型干扰源: 电磁干扰(EMI):变频器、大功率电机等设备产生的宽频带噪声 地环路干扰:不同设备间接地电位差导致的共…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/10 22:32:48

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/10 6:57:56

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

2026/7/11 0:02:03

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字隐私日益重要的今天,微信聊天记录作为个人数字资产的重要组成…

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

2026/7/11 0:02:03

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载…

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

2026/7/11 0:02:03

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案 一、数据库备份最容易被忽略的问题,不是「有没有做备份」,而是「备份能不能恢复、恢复要多久、以及恢复后的数据对不对」 很多团队做数据库备份的方式是「写个 cron job&am…