当前位置:网站首页>#夏日挑战赛# 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
边栏推荐
猜你喜欢
AI+BI+可视化,Sugar BI架构深度剖析
《安富莱嵌入式周报》第276期:2022.07.25--2022.07.31
leetcode-268.丢失的数字
基于DMS的数仓智能运维服务,知多少?
常见分布式理论(CAP、BASE)和一致性协议(Gosssip、Raft)
【数据库数据恢复】SqlServer数据库无法读取的数据恢复案例
[QT] Qt project demo: data is displayed on the ui interface, double-click the mouse to display specific information in a pop-up window
Small Tools (4) integrated Seata1.5.2 distributed transactions
【QT】Qt 给已经开发好的程序快速封装成动态库
出海季,互联网出海锦囊之本地化
随机推荐
红蓝对抗经验分享:CS免杀姿势
技术干货|如何将 Pulsar 数据快速且无缝接入 Apache Doris
Difference and performance comparison between HAL and LL library of STM32
全新探险者以40万的产品击穿豪华SUV价格壁垒
Some optional strategies and usage scenarios for PWA application Service Worker caching
破解数字化转型困局,企业分析协同场景案例解析
简易网络传输方法
一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程
一文看懂推荐系统:概要02:推荐系统的链路,从召回粗排,到精排,到重排,最终推荐展示给用户
Spark entry learning-2
unity用代码生成LightProbeGroup
一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
使用Make/CMake编译ARM裸机程序(基于HT32F52352 Cortex-M0+)
How to start an NFT collection
devops-2:Jenkins的使用及Pipeline语法讲解
socket快速理解
想进阿里?先来搞懂一下分布式事务
mysql delete execution error: You can't specify target table 'doctor_info' for update in FROM clause
"Avnet Embedded Weekly" Issue 276: 2022.07.25--2022.07.31
建造者模式/生成器模式