【Harmony Next】七夕前学会创建开屏动画拿下女同事的芳心

news/2024/11/19 16:25:47/文章来源:https://www.cnblogs.com/zhxassadvd/p/18347559

【Harmony Next】七夕前学会创建开屏动画拿下女同事的芳心

一个优秀的项目需要一个*格够高的动画来开启,下面教你用三步快速实现鸿蒙应用的开屏动画

gif.gif

1.创建窗口

使用windowStage.createSubWindow("splash_window")创建窗口对窗口进行管理,实现加载开屏动画

01.png

在UIAbility的生命周期里面创建窗口进行操作

async onWindowStageCreate(windowStage: window.WindowStage) {// Main window is created, set main page for this abilityhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');actionWindowStageCreate(windowStage);const win = await windowStage.createSubWindow("splash_window")//创建窗口await win.showWindow()//显示窗口win.setUIContent("pages/SplashPage")//开屏动画的承载页面windowStage.loadContent('pages/YoutubePage', (err) => {//加载项目的主入口if (err.code) {hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');return;}hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');});}

2.使用Canvas组件实现动画效果

02.png

Canvas的动画实现

 private mainRenderingSettings: RenderingContextSettings = new RenderingContextSettings(true)private mainCanvasRenderingContext: CanvasRenderingContext2D =new CanvasRenderingContext2D(this.mainRenderingSettings)private animationItem ?: AnimationItemprivate path: string = "/lotties/ani_splash.json"@State pageOpacity: number = 1Canvas(this.mainCanvasRenderingContext).height(375).width(375).onReady(() => {//抗锯齿的设置this.mainCanvasRenderingContext.imageSmoothingEnabled = true;this.mainCanvasRenderingContext.imageSmoothingQuality = 'medium'this.animationItem = lottie.loadAnimation({container: this.mainCanvasRenderingContext, // 渲染上下文renderer: 'canvas', // 渲染方式loop: false, // 是否循环播放,默认trueautoplay: true, // 是否自动播放,默认truecontentMode: 'Fill', // 填充的模式frameRate: 60, //设置animator的刷帧率为30path: this.path, // json对象数据})})
}
.backgroundColor(Color.White)
.align(Alignment.Center)
.size(matchSize)

3.窗口的自我管理

窗口在创建后需要关闭后才能显示出程序的主入口窗口,当然一个优秀的窗口是不需要用户进行手动关闭的,需要在开屏动画页展示完成后关闭,类似于广告展示完毕后关闭

添加定时器进行实现(也可以将关闭的动作放在动画加载完的事件中去)

timer: number = -1
closeWin () {window.findWindow("splash_window").destroyWindow()
}
adTime:number = 0
aboutToAppear() {ScreenUtil.init(this)ScreenUtil.setFullScreen(true)this.timer = setInterval(() => {if(this.adTime === 0) {clearInterval(this.timer)this.closeWin()return}this.adTime--}, 2800)
}

核心的API: window.findWindow("splash_window").destroyWindow()

需要获取到当前的窗口再进行关闭,在创建的时候使用了关键字“splash_window”创建,使用window.findWindow可以获取到这个窗口然后进行相应的操作

完整的开屏动画页代码:

/*** 启屏页*/
import { router, window } from '@kit.ArkUI'
import lottie, { AnimationItem } from '@ohos/lottie'
import { LogUtil } from '../utils/LogUtil'import { ScreenUtil } from '../utils/ScreenUtil'
import { windowManager } from '../utils/windowManager'let matchSize: SizeOptions = {width: "100%",height: "100%"
}@Entry
@Component
struct SplashPage {private mainRenderingSettings: RenderingContextSettings = new RenderingContextSettings(true)private mainCanvasRenderingContext: CanvasRenderingContext2D =new CanvasRenderingContext2D(this.mainRenderingSettings)private animationItem ?: AnimationItemprivate path: string = "/lotties/ani_splash.json"@State pageOpacity: number = 1build() {Stack() {Canvas(this.mainCanvasRenderingContext).height(375).width(375).onReady(() => {//抗锯齿的设置this.mainCanvasRenderingContext.imageSmoothingEnabled = true;this.mainCanvasRenderingContext.imageSmoothingQuality = 'medium'this.animationItem = lottie.loadAnimation({container: this.mainCanvasRenderingContext, // 渲染上下文renderer: 'canvas', // 渲染方式loop: false, // 是否循环播放,默认trueautoplay: true, // 是否自动播放,默认truecontentMode: 'Fill', // 填充的模式frameRate: 60, //设置animator的刷帧率为30path: this.path, // json对象数据})})}.backgroundColor(Color.White).align(Alignment.Center).size(matchSize)}timer: number = -1closeWin () {window.findWindow("splash_window").destroyWindow()}adTime:number = 0aboutToAppear() {ScreenUtil.init(this)ScreenUtil.setFullScreen(true)this.timer = setInterval(() => {if(this.adTime === 0) {clearInterval(this.timer)this.closeWin()return}this.adTime--}, 2800)}
aboutToDisappear(): void {windowManager.settingBarBlank()}pageTransition() {PageTransitionExit({ duration: 1000, curve: Curve.Ease }).opacity(0)}
}

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取客户端真实IP

出于安全考虑,近期在处理一个记录用户真实IP的需求。本来以为很简单,后来发现没有本来以为的简单。这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后,如何取得客户端的外网IP。  来自客户端PC的流量路径如上,在这样的拓扑中,在应用服务中取…

获取客户端真实IP备忘

出于安全考虑,近期在处理一个记录用户真实IP的需求。本来以为很简单,后来发现没有本来以为的简单。这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后,如何取得客户端的外网IP。  来自客户端PC的流量路径如上,在这样的拓扑中,在应用服务中取…

[OI] 欢夏!邪龙?马拉车!

标题来自原神 算法概述 Maracher 算法 用途:寻找回文串,最板子的情况下用于字符串的回文子串计数给定一个字符串 \(S\),求出它全部的回文子串容易想到一种暴力的 \(n^{2}\) 做法,即枚举全部中心点,开双指针向两边扩展,每扩展一次就提供 \(1\) 的贡献. 事实上,对于这样的…

一行命令搞定内网穿透

一行命令搞定内网穿透 一款开源免费的内网穿透工具:localtunnel ,基于 nodejs 实现,无需修改 DNS 和防火墙设置,方便快捷的将内网服务暴露到外网,为开发人员、测试人员以及需要分享本地项目的人提供实时的公网访问方式,以便于测试和共享!功能特性一行命令启动,无需复杂…

中电信翼康济世数据中台基于Apache SeaTunnel构建数据集成平台经验分享

Apache SeaTunnel作为一个高效、灵活的数据集成平台,在数据中台战略中扮演着重要角色。通过本文的介绍,读者可以了解如何基于SeaTunnel快速搭建数据集成平台,并在实际应用中灵活运用。未来,随着技术的不断发展,SeaTunnel将继续在数据集成领域发挥重要作用,助力企业实现数…

数据集可以自己找开源

数据集可以自己找开源,比如GitHub上面的等等。 比如这个:https://github.com/bstabler/TransportationNetworks/tree/master其他相关项目 TRB网络建模委员会 InverseVIsTraffic是一个开源存储库,它实现了一些针对单类和多类交通网络提出的逆变分不等式 (VI) 公式。该软件包还…

js实战小项目随笔

获取事件源 var img = document.getElementById("imgs"); setAttribute为事件源赋值 img.setAttribute("src", "./image/" + index + ".jpg"); 图片切换

泛微OA移动端在公网IP变更和无法打开Install.do界面下修改插件库地址(122,128报错)

事情起因 因为公司搬迁,公网IP变更,服务器搬迁时未提前调整好泛微oa服务器的IP,但是旧地址仍留有主路由可以使用。 发现问题移动端无法正常连接,/install.do的界面也无法打开,无法进入修改插件库服务器IP的页面 联系了技术,技术表示/install.do无法打开的话也无能为力(因…

[Paper Reading] DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION link 时间:2021(ICLR) 机构:Sensetime & USTC & CUHK TL;DR 参考2D Deformable Conv,通过在Reference Point附近增加sample points,将DETR的收敛速度提升10倍,对于小目标效果也更好。 …

js学习

变量通过prompt收集输入信息声明变量特殊情况八股文字符类型可以随时变换js中数字前补0为八进制,补0x为十六进制方法:isNaN(),如果是数字返回false,反之返回true字符串转义符字符串与别的类型拼接,拼接后为字符串字符串内设置变量布尔值数据类型,true参与运算时作为1,…

QStyledItemDelegate 和QTreeView实现鼠标hover消息

1.QTreeView设置属性mousetracking和tablettracing 重写QStyledItemDelegate类,重写函数 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); 这个函数里可以处理鼠标hover和点击事件;bo…

c# net6 读取appsettings.json方法

如图:一、appsettings.json{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","SqlServer": {"Server":…