当前位置:网站首页>#夏日挑战赛# HarmonyOS 实现一个绘画板
#夏日挑战赛# HarmonyOS 实现一个绘画板
2022-08-03 15:59:00 【51CTO】
前言
本篇还是canvas内容,实现的是一个绘画板,本次绘画板的功能比较多一些,包括画笔颜色切换、清空、橡皮擦、保存、撤回、反撤回。可以用该绘画板来完成一些基础的绘画功能。
介绍
这是一个绘画板,我们可以实现简单的绘画,功能包括:画笔颜色切换、清空、橡皮擦、保存、撤回、反撤回
效果展示
原理分析
1.线条生成
这是最基础的功能,具体实现方法,前面的文章也介绍过。
首先,我们需要将canvas上下文对象,需要在触摸移动事件中绑定,因为我们是通过触摸来生成对应线条的。
然后,定义两个数组,分别存储鼠标经过的x与y坐标,在鼠标按下时开始记录,在鼠标移动时,也将坐标push到数组中
最后,将获取的坐标通过绘画方法,通过moveTo和lineTo进行绘画,即可得到线条。
2.清空画板
清空画布的功能最简单,调用canvasAPI的ctx.clearRect即可
API介绍:clearRect(x: number, y: number, w: number, h: number): void
- x:指定矩形上的左上角x坐标;
- y:指定矩形上的左上角y坐标;
- width:指定矩形的宽度;
- height:指定矩形的高度;
这里因为是清空,所以只需要将在坐标设置为左上角,然后宽高设置为和当前canvs画布宽高一致即可清空画板
3.橡皮擦
这里的实现实际和清空画板一样,只是橡皮擦清空的面积小很多
首先,定义一个标识,来判断是否需要橡皮擦功能,用户通过点击下面的橡皮擦图片进行控制
然后,我们需要在触摸移动事件,提前判断是否需要橡皮擦功能,如果需要,我们将画线功能替换为橡皮擦功能,功能实现的API和清空画板一样
最后,就是橡皮擦大小的问题,我们可以提前定义一个属性,用来控制大小,在橡皮擦功能中,将该属性添加即可
4.保存绘画
这里还没实现出来
这里利用了canvas的一个API:toDataURL(type?: string, quality?:number)
可以生成一个包含图片展示的URL
参数:
type: 可选参数,用于指定图像格式,默认格式为image/png;
quality:在指定图片格式为image/jpeg或image/webp的情况下,可以从0到1的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92。
返回值:
- string:图像的URL地址
我们可以通过toDataURL将获取到的图像的URL地址进行存储,在需要的地方生成canvas图像即可
5.撤回
撤回功能用到的API比较多,需要耐心的阅读文档
在实现撤回功能之前,我们需要将每次绘画出来的线条进行存储,在鼠标抬起事件中,通过toDataURL()将获取到当前的图像,push到数组中,存储起来
实现撤回功能:
首先,需要一个属性:步频,我们每次绘画一条线段,step就自增,撤回功能中,只需要将当前步频-1,就能拿到上一次绘画的图像
然后,将当前的图像清空,通过clearRect
最后,拿到上一次的图像,通过onload函数,将图像进行绘画,通过drawImage实现绘画功能
6.反撤回
反撤回的实现基本上和撤回一样,只不过获取的图像不同
和撤回一样,需要拿到每次的图像,这里可以直接利用撤回中获取的图像
实现反撤回功能:
首先,每次反撤回,需要将步频++,我们就可以拿到当前显示画像的前一张画画像
然后,将当前的图像清空,通过clearRect
最后,拿到上一次的图像,通过onload函数,将图像进行绘画,通过drawImage实现绘画功能
7.线条样式
线条颜色实现比较简单,当用户点击需要的颜色样式时,修改画布的ctx.strokeStyle即可。
完整代码
index.js
总结
不足点:
保存功能还没完全完成
绘制的曲线并不是很好看,优化方案:添加贝赛尔曲线
贝赛尔曲线是用来绘制曲线的,一般的矢量图形软件通过它来精确画出曲线
最后,这个canvasAPI实在有点多,需要耐心点看,在读OpenHarmony官方文档时,还发现两处问题,提了两个issure
边栏推荐
- ECCV 2022 | 基于关系查询的时序动作检测方法
- DC-DC 2C(40W/30W) JD6606SX2退功率应用
- CopyOnWriteArrayList details
- CopyOnWriteArrayList详解
- How to start an NFT collection
- MySQL性能优化_小表驱动大表
- 用友YonSuite与旺店通数据集成对接-技术篇2
- 一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
- 【Unity入门计划】制作RubyAdventure01-玩家的创建&移动
- 一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程
猜你喜欢
Yuan xiaolin: Volvo focus on travel security, and put it perfectly
leetcode-268.丢失的数字
"Avnet Embedded Weekly" Issue 276: 2022.07.25--2022.07.31
Not to be ignored!Features and advantages of outdoor LED display
Essentially a database data recovery 】 【 database cannot read data recovery case
如何将二维空间先验注入到ViT中? UMA&港理工&阿里提出SP-ViT,为视觉Transformer学习2D空间先验知识!...
Awesome!Coroutines are finally here!Thread is about to be in the past
TCP 可靠吗?为什么?
聊聊这个SaaS领域爆火的话题
ReentrantLock详解
随机推荐
新一代网状网协议T-Mesh无线通信技术优势介绍
window.open does not show favicon.icon
Introduction to the advantages of the new generation mesh network protocol T-Mesh wireless communication technology
WordPress建站技术笔记
在 360 度绩效评估中应该问的 20 个问题
简易网络传输方法
Neural networks, cool?
Basic knowledge points in js - events
ReentrantReadWriteLock详解
QT QT 】 【 to have developed a good program for packaging into a dynamic library
How to start an NFT collection
How to get the 2 d space prior to ViT?UMA & Hong Kong institute of technology & ali SP - ViT, study for visual Transformer 2 d space prior knowledge!.
leetcode-268.丢失的数字
ReentrantLock详解
MPLS的wpn实验
Optimal Power Flow (OPF) for High Voltage Direct Current (HVDC) (Matlab code implementation)
微电网和直流电网中最优潮流(OPF)的凸优化(Matlab代码实现)
WordPress 5.2.3 更新,升级出现请求超时的解决方法
1、实例开启无锁表结构变更以后,在任务编排中通过“单实例SQL”节点进行的结构变更,是优先采用无锁表
为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案