HarmonyOS使用ArkUI绘制圣诞树

news2025/1/12 23:30:13

一、前言

起因我参加了 “挑战代码画颗圣诞树” 活动,又因为本次推出一个“圣诞定制勋章”活动,一个是传资源,一个是写文章,为了更好的把知识传递给大家,所以我又出了这篇文章,大家进来一起学习一下吧。

二、创意名

基于HarmonyOS的ArkUI(方舟UI) + SVG相关技术知识点绘制圣诞树

三、效果展示

四、实现步骤

我们使用SVG数据 点击查看

我们简单看下整个 SVG 内容的组成

那么我们知道这个SVG内容组成,如何通过HarmonyOS的ArkUI去绘制呢?

我们在HarmonyOS的绘制组件中找到下面这几个可以操作路径数据

点击查看绘制组件文档

我们接着看,我们看到 ellipse 下面的第一个 path 的路径数据:

M260,185c0,0,2.5-0.8,6.7,2.6c4.3,3.4,121.1,81.2,121.1,81.2s4,3.9,1.6,9.6C387,284,383,286,383, 286s-49,41-123,41c-76,0-123-42.2-123-42.2s-6.1-2.8-6.5-6.8s-0.4-7.3,2.6-10.1c3-2.9,12
0.1-80.1,120.1-80.1S255,185,260,185z

这个时候我们就需要用到 Path 的属性 commands 设置我们的路径数据:

Path().commands("M260,185c0,0,2.5-0.8,6.7,2.6c4.3,3.4,121.1,81.2,121.1,81.2s4,3.9,1.6,9.6C38
7,284,383,286,383,286s-49,41-123,41c-76,0-123-42.2-123-42.2s-6.1-2.8-6.5-6.8s-0.4-7. 3,2.6-10.1c3-2.9,120.1-80.1,120.1-80.1S255,185,260,185z").fill('#42CE8E')

设置之后,我们可以看到,绘制出来的内容如下:

看完发现,这太简单了吧,哈哈哈,那么 ellipse 如何绘制呢?

我们看第一个 ellipse 的内容

<ellipse id="tree-base" fill="#39445B" cx="259.5" cy="319" rx="120" ry="38"/>

那么我们如何使用呢?又该如何使用里面的数据呢?

我们先看看 SVG 里面的 ellipse 元素里面的内容含义:SVG:可缩放矢量图形 - ellipse

那么,HarmonyOS 里面的 ArkTS 如何绘制这个 ellipse 元素?

我们通过 SVG 里面的内容可以计算出来 width/height:

Width = 120 * 2 => 240px
Height = 38*2 => 76px

这个时候还不够,我们知道 SVG 里面设置了 cxcy 中心点坐标

那么这个 cx 和 cy,在 HarmonyOS 里面如何设置?

我们通过 HarmonyOS 的文档的通用属性里面找到如下属性:

那么这个 x 和 y 如何计算出来?

X = 259.5-120 => 139.5px
Y = 390 - 38*2 => 314px

那么我们进行如下代码设置

Ellipse({
width: '240px', height: '76px'
}).fill('#39445B')
.offset({
x: '139.5px', y: '314px'
})

运行之后,看到效果如下

我们在 SVG 里面还看到 2 个新的元素
Circle、Polygon 那么这 2 个如何使用呢?

我们根据上面的内容,同样的可以应用到 Circle 和 Polygon 里面,
如果我们使用下面这个 Circle:

<circle id="l1-r4-s2" class="shadow-2" opacity="0.5" fill="#FFDF9F" cx="146" cy="256"
r="15"/>

这个 Circle 里面的内容都代表什么内容呢?点击查看

同样的 HarmonyOS 里面也有 Circle 绘制组件

Width = 15 * 2 => 30px
Heigth = 15 * 2 => 30px

同样的中心点,我们可以通过 offset 进行位置调整

X = 320 - 15 => 305px
Y = 286 - 15 => 271px

Circle().size({ width : '30px', Height: '30px'})
.fill('#FFDF9F')
.fillOpacity(0.5)
.offset({
	x:'305px', y:'271px'
})

polygon 不同,我们只需要设置 point 点坐标类型

HarmonyOS 文档里面的 polygon,点击查看

SVG 里面的内容:

<polygon id="gift-red-side-shadow" fill="#D10F50" points="335,345 315,339 315,319
335,323"/>

我们直接使用里面的坐标即可。

Polygon()
.fill('#D10F50')
.points([['335px','345px'],['315px','339px'] ,['315px','319px'], ['335px','323px']])

我们把上面用到的知识点,用到我的项目中,SVG中有g元素标签的,使用Shape绘制组件,其他的在HarmonyOS文档中查找到和SVG同名的组件进行绘制。

我们看到,我们点击小猫咪的时候,它会进行躲藏,这里同时使用到了ArkUI的显示动画

我们通过下面animateTo的方式进行 躲藏探头 动画:

 animateTo({
      duration: 500,
      curve: Curve.EaseOut,
      iterations: 1,
      playMode: PlayMode.Normal,
      onFinish: () => {
        // 设置一个超时机制,如果这个时间范围内,没有点击,则触发小猫探头
        this.timerId = setTimeout(() => {
          animateTo({
            duration: 400,
            curve: Curve.EaseOut,
            iterations: 1,
            playMode: PlayMode.Normal,
          }, () => {
            // 探头,哈哈哈
            this.catAnimationModel = {
              ...this.catAnimationModel,
              translateY: '0px'
            }
          })
        }, 800)
      }
    }, () => {
      // 躲猫猫
      this.catAnimationModel = {
        ...this.catAnimationModel,
        translateY: '60px'
      }
    })

在Shape绘制组件中添加 translate属性方法,大致如下:

 Shape(){
   ....
 }.translate({y: this.viewModel.getCatTranslateY()})
  .viewPort({
    width: '520px',
    height: '390px'
  })

只要执行了animateTo,我们的猫咪就可以进行躲藏和探头了。


点击下载HarmonyOS绘制圣诞树源码

感兴趣的同学,可以去学习我们的另一篇文章:HarmonyOS玩转ArkUI动效 - 水母动画

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux- 系统随你玩之--操作文件和目录

文章目录1、前言2、文件、目录相关的指令2.1、当前所在目录2.2、当前目录所有的文件和目录2.3、切换当前工作目录2.4、 创建目录与文件2.6 、拷贝文件3 、文本查看3.1、cat 查看文件内容3.2、head 查看前n行内容3.3、tail 查询后n行内容4、文本编辑4.1、vi 指令4.2、more 指令4…

华为三层交换机做中继,WinServer2012当DHCP服务器

ENSP桥接一台 Windows Server&#xff0c;当DHCP服务器 1、拓扑图 2、汇聚交换机设置 <Huawei>sys# 关闭消息提示 [Huawei]undo in en[Huawei]sys SW1# 批量创建 VLAN [SW1]vlan batch 10 20 30 100# 设置 VLAN 为 Trunk [SW1]int g0/0/1 [SW1-GigabitEthernet0/0/1]p…

【电商】电商后台---FMS财务管理系统

文章对电商财务系统进行了系统的介绍&#xff0c;希望通过此文能够加深你对电商系统的认识。 目前互联网电商公司的系统非常多、系统间的关系也非常复杂&#xff0c;最近各公司都热衷于中台&#xff0c;应用的技术也相当之多&#xff0c;技术实力弱点的公司只能借助于各平台加快…

uAvionix获得FAA合同,部署和演示多个无人机同时飞行的C波段频率分配管理(FAM)

uAvionix宣布&#xff0c;它已赢得美国联邦航空管理局(FAA)的合同&#xff0c;作为uAvionix SkyLine™指挥和控制通信服务提供商(C2CSP)管理平台的组件&#xff0c;对频率分配管理器(FAM)进行多次端到端演示。 这次大规模演示将使运营SkyLine平台的频率管理组织(FMO)能够将国际…

基于STM32与TB6600的机械臂项目(代码开源)

前言&#xff1a;本文为手把手教学STM32的机械臂项目——Robot Arm&#xff0c;本次项目采用的是STM32作为MCU。该机械臂的基础模型为国外开源项目&#xff0c;诸多前辈经过长时间的验证与改进&#xff0c;其机械臂精度可以满足日常需求。本项目机械臂为三自由度机械臂&#xf…

mongodb-9.数据库连接,集合创建

文章目录数据库连接集合创建查询删除查询显示指定字段限制查询条数 limit &#xff0c;skip排序索引创建聚合查询数据库连接 mongodb URL mongodb://[username:password]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]语法说明如下&#xff1a;…

JSP ssh网络点餐系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh网络点餐系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Mye…

vue3 antd项目实战——input输入框限制输入内容和长度,Form表单动态校验规则

input输入框设置只能输入中文&#xff0c;输入长度为20&#xff0c;输入不能为空知识调用场景复现解决方案1.下方有提示文字2.限制输入内容只能是中文3.限制输入长度为204.动态校验规则&#xff08;必填项&#xff09;input源代码&#xff08;按需调整即可&#xff09;知识调用…

【区块链 | EVM】深入理解学习EVM - 深入理解EVM操作码,让你写出更好的智能合约

那些非典型的开销导致经典的软件设计模式在合约编程语言中看起来既低效又奇怪。如果想要识别这些模式并理解他们导致效率变高/低的原因&#xff0c;你必须首先对以太坊虚拟机&#xff08;即 EVM&#xff09;有一个基本的了解。 你的一些编程“好习惯”反而会让你写出低效的智能…

Linux当中的Sersync实时同步服务及其实战举例

目录 一、实时同步 1.定义 2.原理 3.实时同步场景 4.实时同步工具 &#xff08;1&#xff09;sersync &#xff08;2&#xff09;Lysncd 二、实时同步实例 1.环境规划 2.配置思路 NFS存储服务如下&#xff1a; &#xff08;1&#xff09;安装NFS &#xff08;2&am…

40. 使用块的网络(VGG)

虽然AlexNet证明深层神经网络卓有成效&#xff0c;但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&#xff0c;我们将介绍一些常用于设计深层神经网络的启发式概念。 与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程类似&#x…

Node.js--》三大常见模块的使用讲解

目录 fs文件系统模块 fs.readFile()方法 fs.writeFile()方法 readFile与writeFile的使用 fs模块路径动态拼接问题 path路径模块 path.join()方法 path.basename() path.extname() path.parse() http模块 req请求对象 res响应对象 解决中文乱码问题 响应不同内容…

Python实现猎人猎物优化算法(HPO)优化支持向量机回归模型(SVR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的优…

计算机系统基础实验 - 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示

实验3 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示 实验序号&#xff1a;3 实验名称&#xff1a;同符号浮点数加法运算/无符号定点数乘法运算的机器级表示 适用专业&#xff1a;软件工程 学 时 数&#xff1a;2学时 一、实验目的 1.掌握定点数乘法溢出的判定方法…

Kafka触发Rebalance的场景分析

文章目录前言触发Rebalance的原因1. 消费者成员发生变化2. 分区数发生变化3. 订阅Topic发生变化Rebalance全流程介绍场景一&#xff1a;新成员入组场景二&#xff1a;成员主动离组场景三&#xff1a;成员崩溃离组场景四&#xff1a;组成员提交位移前言 所谓Rebalance就是让Con…

Python小工具-复制嵌套目录下的多个word文档到指定目录

文章目录Python小工具-复制嵌套目录下的多个word文档到指定目录需求原始数据工具实现思路代码实现1-6 配置项目7 定义file_type_to_reduce_dir函数完成文件复制或移动8 定义list_dir_by_level函数完成遍历调用函数并执行待改进地方完整代码自我反省Python小工具-复制嵌套目录下…

全志 Linux 系统启动优化 启动优化速度方式 优化启动流程 优化uboot 优化kernel等

文章目录1 概述2 启动速度优化简介2.1 启动流程2.2 测量方法2.2.1 printk time2.2.2 initcall_debug2.2.3 bootgraph.2.2.4 bootchart2.2.5 gpio 示波器.2.2.6 grabserial.2.3 优化方法2.3.1 boot0启动优化2.3.1.1 非安全启动.2.3.1.2 安全启动2.3.2 uboot启动优化2.3.2.1 完全…

07、SpringCloud 系列:Alibaba - 介绍

SpringCloud 系列列表&#xff1a; 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

一套ASP.NET优惠券领取微信小程序源码(前台+后台)

ASP.NET优惠券领取微信小程序源码&#xff08;前台后台&#xff09; 源码免费分享&#xff01;需要源码学习可私信我。 一、源码特点 1、这是一个微信小程序对接淘宝的淘宝客api自助搜索优惠券领取程序&#xff0c;简单易学。 2、后台采用asp.netMvc框架开发、实现了调用阿里妈…

Java I/O(五)NIO应用之Netty

Netty 目录Netty1 Netty概览2 Netty核心组件2.1 Bootstrap和ServerBootStrap&#xff08;启动引导类&#xff09;2.2 Channel&#xff08;网络操作抽象类&#xff09;2.3 EventLoop&#xff08;事件循环&#xff09;2.4 EventLoopGroup&#xff08;事件循环组&#xff09;2.7 C…