大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,欢迎关注!

今天是教师节,教师是我最尊敬的职业。感恩一路走来遇到的引路人、一日为师、终身难忘!今天,我来手搓一个教师节贺卡,送给天下所有的老师。

一、需求设计

1、实现效果

包含动画效果:

  • 顶部一架纸飞机从左到右不断飞行;

  • 中间文字以打字机效果呈现;

  • 底部爱心不断上下跳跃

2、技术分析

整体采用一张图片作为背景;中间文字部分通过定时器输出文字,实现打字机效果;底部爱心是一个自定义图形,通过ArkUI提供的自定义绘制组件Canvas来实现心形绘制,再结合ArkUI提供的动画功能实现心形上下跳动效果。

二、界面制作

1、布局分析

2、界面制作

使用DevEco Studio创建项目,将teacher_bg.gif 背景图片拷贝到resources/base/media目录下。

2.1 制作主界面

在项目pages目录下新建文件:TeachersDay.ets,内容如下:

@Entry
@Component
struct TeachersDay {
build() {
Stack({ alignContent: Alignment.Center }) {
//1、 背景图
Image($r('app.media.teacher_bg'))
.width('100%')
.height('120%') //2、 文本
Text("三尺讲台,一柄戒尺\n回首只闻桃李芬芳\n老师,谢谢你的精心教导")
.fontSize(26)
.fontWeight(FontWeight.Bold)
.fontColor(Color.White)
.lineHeight(40)//行高
.letterSpacing(2) //字间距 //3、 心形
//todo:封装心形组件,减少主文件代码
}
.width('100%')
.height('100%')
.expandSafeArea([SafeAreaType.SYSTEM]) //去白边
}
}

这样就实现了界面主体框架,接下来通过Canvas绘制底部的心形图。

2.2 制作心形组件

为了方便代码复用,同时减少主界面代码,讲心形组件单独疯转到自定义组件中。

在ets目录下新建view目录,用于存放自定义组件。在view目录下新建心形组件,HeartCom.ets文件,内容如下:

// 爱心组件
@Component
export struct HeartCom{
private seetings:RenderingContextSettings =new RenderingContextSettings(true)
private ctx:CanvasRenderingContext2D=new CanvasRenderingContext2D(this.seetings)
private screenX:number=0 //画布长
private screenY: number = 0 //画布宽
startY: number = 0 //爱心区域最低位置Y坐标
endY: number = 0 //爱心区域最高位置Y坐标
shortSide: number = 0 //爱心区域边长
build(){
Flex({
direction: FlexDirection.Column,
alignItems: ItemAlign.Center,
justifyContent: FlexAlign.Center
}){
Canvas(this.ctx)
.width('100%')
.height('100%')
.backgroundColor(Color.Transparent)
.onReady(() => {
let can = this.ctx
// 画布赋值
this.screenX = can.width
this.screenY = can.height
this.startY = (this.screenY - this.screenX) / 2
this.endY = this.screenX + (this.screenY - this.screenX) / 2
this.shortSide = this.screenX // 绘制爱心(控制关键几个点的位置)
can.fillStyle = "#ff0000"
can.moveTo(this.screenX / 2, this.startY + this.shortSide / 3)
can.bezierCurveTo(this.screenX / 6, this.startY, 0, this.screenY / 2, this.screenX / 2,
this.endY - this.shortSide / 6) //立体效果
let grad = can.createLinearGradient(0, 0, this.screenX, this.endY)
grad.addColorStop(0.0, '#fd0000')
grad.addColorStop(1.0, '#ffffff')
can.fillStyle = grad can.fill()
can.beginPath()
can.moveTo(this.screenX / 2, this.startY + this.shortSide / 3)
can.bezierCurveTo(this.screenX * 5 / 6, this.startY, this.screenX, this.screenY / 2, this.screenX / 2,
this.endY - this.shortSide / 6)
can.fill() })
}
}
}

在该组件中,使用Canvas组件完成心形绘制,并通过export导出组件,以便供其它组件使用。

接下来,在主界面中中引入该组件,并将其显示到主界面中。主界面TeachersDay.ets文件做如下修改:

import { HeartCom } from '../view/HeartCom'
... //3、 心形
//todo:封装心形组件,减少主文件代码
HeartCom()
.width(150)
.height(150)
.margin({ top: 400 })
...

至此,完成静态的界面制作。

三、功能实现

1、打字机效果

接下来,将主界面中间的文字添加打字机效果(一个字一个字的输出)。

修改主界面,将显示文本存放到变量,并通过定时器取文本进行显示。文件TeachersDay.ets修改如下:

@State message?: string = "" //打印文本
intervalID?: number //定时器 ...
//2、 文本
Text(this.message)
... onPageShow() {
this.printer() //触发打字
} // 打字机效果
private printer() {
let data = "三尺讲台,一柄戒尺\n回首只闻桃李芬芳\n老师,谢谢你的精心教导"
let position: number = 0
this.intervalID = setInterval(() => {
position = position + 1
this.message = data.substring(0, position)
if (this.message.length >= data.length) {
clearInterval(this.intervalID)
}
}, 400)
}

以上代码将界面显示的文本存放到状态变量message,封装printer函数通过定时器setInterval实现每400毫秒打印一个字符。在页面显示的周期函数onPageShow中触发打字操作。

这样,就实现了文本打字机效果。

2、心形动画

接下来,通过设置动画效果,让底部的心形上下跳动起来。

在TeachersDay.ets文件中,找到心形组件HeartCom,为其设置animation动画属性实现动画效果。TeachersDay.ets文件修改内容如下:

...
@State initSize: number = 400
@State flag: boolean = false
... //3、 心形
HeartCom()
.width(150)
.height(150)
.margin({ top: this.initSize })
.animation({
iterations: 1,
duration: 1000,
curve: this.flag ? Curve.LinearOutSlowIn : Curve.FastOutLinearIn,
playMode: PlayMode.Alternate,
onFinish: () => {
if (this.flag) {
this.initSize = 400
this.flag = false
} else {
this.initSize = 500
this.flag = true
}
}
}) ...
onPageShow() {
this.initSize = 500 //触发动画
}
...

通过initSize记录心形组件初始margin值,在onPageShow周期函数中将其值设置为500,表示初始时心形组件距离顶部400,页面显示时向下移动至500,这就让margin属性产生了变化。而心形组件通过animation属性设置了属性动画,就会让这一变化产生从上往下的动画效果。在属性动画中,通过控制flag的值来让心形组件不断进行上下跳动,从而实现不停跳跃的动画效果。

至此、教师节贺卡动画功能实现。

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,欢迎关注!

HarmonyOS编写教师节贺卡的更多相关文章

  1. [Mugeda HTML5技术教程之19]制作可定制贺卡

    本文档通过一个实例介绍可定制贺卡的动画的制作过程.实例包含两部分: 1. 动画部分:介绍动画制作过程中如何给祝福词和落款的文本对象命名,如何给定制按钮定义表单动作. 2. 代码部分:介绍贺卡的脚本逻辑 ...

  2. 【5号课堂】scratch制作电子生日贺卡

    贺卡在我国的使用由来已久,在古代,上层士大夫有用名帖互相问候的习俗 唐宋以后,贺卡的名称及功能有所进步,称为”门状“或“飞帖“,到了明清,又叫“红单“.“贺年帖“等等,听着名字就知功能越来越世俗化,文 ...

  3. 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!

        1. 你不知道的鸿蒙(HarmonyOS)   2020年9月10日,华为开发者大会发布了鸿蒙(HarmonyOS)2.0.我在2020-9-11日也发布了全球首套鸿蒙2.0 App开发视频课 ...

  4. #2020征文-手机#深鸿会深大小组:HarmonyOS手机游戏—数字华容道

    目录: 前言 概述 正文 创建项目 实现初始界面布局 实现数字的随机打乱 实现滑动或点击调换数字 实现游戏成功界面 结语 源码包 前言 12月16号HarmonyOS2.0手机开发者Beta版已经发布 ...

  5. HarmonyOS分布式任务调度开发之--你必须知道的bundleName

    背景 最近基于HarmonyOS在写一个通讯录的项目,已经完成了一个java版本的通讯录,通讯录数据全部存储在sqlite数据库中.现在在着手写一个JS版本的通讯录,这时候关于JS版本中数据的读取,我 ...

  6. 如何优雅地开发HarmonyOS APP应用

    目录: 一.挖掘项目需求或者做项目移植 二.创建项目工程 三.功能模块实现的流程思路 四.养成良好的编程规范习惯以及运用设计模式 研究HarmonyOS有一段时间了,今天主要结合自己多年的项目开发经验 ...

  7. HarmonyOS单模块编译与源码导读

    我这里以3518的开发板为例进行讲解,3516的也是通用的. 下面是之前全量编译的脚本 python build.py ipcamera_hi3518ev300 -b debug HarmonyOS最 ...

  8. HarmonyOS应用开发-Component体系介绍(一)

    目录: 1. Component的内部类/接口 2. Component方法简介 3.总结 在HarmonyOS的UI框架中,Component为用户界面提供基本组件,Component类位于ohos ...

  9. 最全华为鸿蒙 HarmonyOS 开发资料汇总

    开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...

  10. HarmonyOS 3.0.0开发者预览版全新发布

    2021年10月22日在华为开发者大会HDC.Together 2021 主题演讲上,我们发布了HarmonyOS 3.0.0开发者预览版,主要内容包括:Harmony设计系统.ArkUI 3.0.A ...

随机推荐

  1. C# Winform 下 DataGridView 行(SelectedRows)转 模型 Model

    /// <summary> /// DataRow 转 Model /// </summary> /// <typeparam name="T"> ...

  2. Docker部署Nginx代理多个服务:公网域名与内网IP场景全解

    本文分享了我在公网和内网两种环境下,使用 Docker 部署 Nginx 并代理多个应用的完整实践.涵盖了常见的端口方式.路径方式.HTTPS 自动跳转.容器网络配置等关键细节,并附上完整的 dock ...

  3. java compareTo 与 equals 区别

    简介 要实现compareTo函数需要实现接口Comparable这个接口 然后这个接口中只有compareTo函数实现一下就可以用Collections.sort等方法. equals 如果不重写, ...

  4. 运用ETL工具快速拉通“有成财务”

    如何运用ETL工具拉取"有成财务"数据并保存到数据库? ETLCloud 是一个数据集成平台,它提供了实时数据处理.抽取.转换.加载以及变更数据捕获(CDC)等功能.这个平台致力于 ...

  5. Hive自定义函数(UDF)开发和应用流程.18981521

    目录 引言 一.Hive自定义函数的类型 二.准备环境和工具 三.实际案例开发编译 四.前方有坑请注意 五.总结 引言      Hive作为大数据领域的核心计算引擎,凭借其强大的SQL支持和丰富的内 ...

  6. torch.randn(*tensor_shape, **kwargs)

    ` randn(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, pin_ ...

  7. Unity ShaderGraph 截图保存为PNG

    很好用的插件 https://github.com/Cyanilux/ShaderGraphToPNG

  8. 单片机+GPRS模块和主流物联网平台实现MQTT协议通信视频教程

    单片机+GPRS模块和主流物联网平台实现MQTT协议通信视频教程 1.单片机+GPRS模块和阿里云物联网平台实现MQTT协议通信视频教程单片机+GPRS模块和阿里云物联网平台实现MQTT协议通信,阿里 ...

  9. FastAPI后台任务:是时候让你的代码飞起来了吗?

    扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ FastAPI Backgroun ...

  10. PostgreSQL View(视图)

    View(视图)是一张假表,只不过是通过相关的名称存储在数据库中的一个 PostgreSQL 语句. View(视图)实际上是一个以预定义的 PostgreSQL 查询形式存在的表的组合. View( ...