首页 > 其他分享 >【Harmony Next】七夕前学会创建开屏动画拿下女同事的芳心

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

时间:2024-08-07 17:49:16浏览次数:6  
标签:动画 mainCanvasRenderingContext 开屏 private Next window Harmony true

【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 ability
   hilog.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 ?: AnimationItem
  private path: string = "/lotties/ani_splash.json"
  @State pageOpacity: number = 1


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, // 是否循环播放,默认true
        autoplay: true, // 是否自动播放,默认true
        contentMode: 'Fill', // 填充的模式
        frameRate: 60, //设置animator的刷帧率为30
        path: 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 ?: AnimationItem
  private path: string = "/lotties/ani_splash.json"
  @State pageOpacity: number = 1

  build() {
    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, // 是否循环播放,默认true
            autoplay: true, // 是否自动播放,默认true
            contentMode: 'Fill', // 填充的模式
            frameRate: 60, //设置animator的刷帧率为30
            path: this.path, // json对象数据
          })
        })
    }
    .backgroundColor(Color.White)
    .align(Alignment.Center)
    .size(matchSize)
  }
  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)
  }
aboutToDisappear(): void {
  windowManager.settingBarBlank()
  }
  pageTransition() {
    PageTransitionExit({ duration: 1000, curve: Curve.Ease })
      .opacity(0)
  }
}

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

标签:动画,mainCanvasRenderingContext,开屏,private,Next,window,Harmony,true
From: https://www.cnblogs.com/zhxassadvd/p/18347559

相关文章

  • HarmonyOS DevEco Studio彻底修改工程名称
    关闭项目将项目文件夹替换为新的名称后重新打开项目将AppScope/app.json5中的bundleName改为新的包名{"app":{"bundleName":"com.example.newname",//改为新的包名"vendor":"example","versionCode":1000000,"......
  • nextjs14 跨域该如何处理
    nextjs官方地址next.config.js和next.config.mjs他有什么区别next.config.js:使用的是CommonJS模块系统。这是Next.js默认的配置文件格式,也是大多数情况下使用的格式。使用require语法导入模块,使用module.exports导出对象。next.config.mjs:使用的是ESMod......
  • HarmonyOS SDK助力美团单车提供便捷流畅扫码新体验
    背景在使用美团单车前,用户需要进行一系列的操作------打开美团App,点击"骑车"进入界面后,再点击"扫码用车",完成扫码后点击"确认开锁",才能最终完成单车开锁。一个简单的动作涉及5个步骤,在远距离或光线过暗等情况下,甚至还需要进行多次扫码才能开锁。策略作为国内头部的科技零售企业......
  • HarmonyOS鸿蒙应用开发之Row & Colum组件的使用
    文章目录Row组件Column组件注意事项其他属性Row和Column组件的通用属性Row组件特有的属性和用法Column组件特有的属性和用法示例代码在HarmonyOS(鸿蒙系统)中,Row和Column组件是ArkTS(ArkTypeScript)语言用于构建用户界面的基础布局容器。它们分别用于实......
  • Win11系统提示找不到PerceptionSimulationExtensions.dll文件
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个PerceptionSimulationExtensions.dll文件(挑......
  • python discord bot nextcord 斜线命令 更改语言
    我想根据用户的不和谐语言更改斜杠命令的名称。如果语言是韩语/서버如果语言是英语/服务器像这样。我可以使用ctx.locale更改里面的内容,但我也想更改名称和描述。我应该怎么办?当我问ChatGPT时,他们说的很奇怪,谷歌上也没有任何信息。但是有一个机器人可以根据语言......
  • HarmonyOS开发商城商品详情页
    目录一:功能概述二:代码实现三:效果图一:功能概述这一节,我们实现商品详情页的开发,具体流程就是在首页的商品列表点击商品跳转到商品详情页面,同时传递参数到该页面,通过参数调用商品详情接口在详情页展示商品的的详情信息。这里我们为了方便返回首页,在最顶部加入返回和回到首......
  • HarmonyOS:如何实现自定义的Tabs,TabContent内部实现如何动态配置
    前言:最近做开发任务的时候,想把Tabs自定义了,并且动态配置TabContent里面的内容,不是写死一样的,这个问题困扰了很长时间,试过**@BuilderParam**(类似于vue的插槽)传组件方式的,但是**@BuilderParam只能传一个,我想要传递的是一个数组,找了很多Api最后找到了WrappedBuilder[]**这种方......
  • HarmonyOS — Stage模型、模块和UIAbility组件
    每一个UIAbility实例,都对应与一个最近的任务列表中的任务。UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互一个应用可以一个模块或多个模块,一个模块中可以有一个UIAbility也可以有多个UIAbility单个UIAbility:任务列表只有一个任务多个UIAbility:任务列表......
  • [Oracle]面试官:你说说rownum、currval与nextval分别是什么,还有没有其他的?
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18338280出自【进步*于辰的博客】目录1、rownum1.1介绍1.2示例2、nextval、currval2.1序列2.2介绍2.3示例最后1、rownum参考笔记一,P18.3/4、P19.5。1.1介绍rownu......