想了解更多开源,请访问:开源基础软件社区https://ost.51cto.com背景目前的电子设备实在是太流行起来,用笔频率大大降低。结果,现在很多人忘写,“丑”字,错别字,用法不当,时有发生。文字是中国传统文化中最重要、最悠久的积淀,蕴含着前人无数的智慧和经验,我们不应丢弃。于是,我开发了一款多功能手写板,实现了练习书法的功能。多功能手写板的存在,可以告别纸质字帖,实现字帖自由,可以在设备上抄写。很多人的笔画不规范,写字的时候会出现笔顺颠倒的现象,直接导致字迹不好看。为了解决这个问题,实现了笔顺纠错和打分功能。符合联合国17项可持续发展目标的优质教育。标准设备环境准备以润和大宇系列HH-SCDAYU200开发板套件为例开发板new|RK3568开发板丝滑体验OpenHarmony标准系统应用编译环境准备下载DevEcoStudio下载地址。SDK版本:OpenHarmonySDKAPI8,请参考ConfiguringOpenHarmonySDK完成DevEcoStudio的安装和开发环境的配置。目录结构└─src├─main││config.json//应用配置文件│││├─js││└─MainAbility│││app.js//应用主入口││││├─common││components││││├├├├├├│├├//绘制模块│││││││││││││││││││││││││布局//标签栏│││││layout.css│││││layout.hml│││││layout.js│││││││││││Note模块││index.css│││││index.hml│││││index.js│││││││││└─写//书法模块││││index.css││index.cs│hml││││index.js│││││││└─图像││└─页面││└─索引//首页││index.css││index.hml││index.js│││└─resources│├─base││├─element││color.json││string.json││││└─media││icon.png│││└─rawfile功能模块1.练字模拟书写,通过速度实现毛笔的粗细,从而模拟书写效果的笔顺检测,实现用户的笔顺通过预先设置书写位置进行检测。评分功能,当用户书写完成后,点击保存,系统会根据书写的准确率进行评分。2.绘画用户可以选择不同粗细和颜色的画笔进行绘画。为了方便用户,还设置了一些功能键,如:清空、橡皮擦、存储、后退、前进。3、note传入富文本,通过richtextAPI解析富文本渲染到屏幕。用户可以点击右侧的小图标进入备注功能,对文章进行批注。关键代码解读1、在使用绘图原理之前,需要先了解canvas组件。可以参考harmonyOS开发者文档。首先,我们需要在触摸移动事件中绑定画布上下文对象,因为我们是通过触摸生成相应的线条。画一条直线,通常用到两个方法,moveTo()和lineTo()。.moveTo()方法用于将画笔移动到指定点,该点为直线的起点,lineTo()为终点。constel=this.$refs.canvas;this.ctx=el.getContext('2d')this.ctx.lineWidth=this.lineWidth/2this.ctx.beginPath()//在线形线帽的两端添加圆圈。this.ctx.lineCap='square'//每次取出数组中的最后一个值作为起点this.ctx.moveTo(this.ArrX[this.ArrX.length-1],this.ArrY[this.ArrY.length-1])this.ctx.lineTo(e.touches[0].localX,e.touches[0].localY)this.ctx.stroke()this.ArrX.push(e.touches[0].localX)this.ArrY.push(e.touches[0].localY)取出数组中的最后一个值作为moveTo的坐标,将鼠标移动后的点作为lineTo的坐标,然后通过绘制中风图像。2.线宽如果要通过速度计算线宽,可能需要获取两点之间的时间,通过时间和距离获取速度。当触发touchmove事件时,存储当前时间戳,最后一次触发事件获取的时间-当前触发事件获取的时间可以用来获取两次触发事件之间的事件间隔。这时候我们就得到了两点时间之间的时间。然后计算两点之间的距离(平方和再开根号),通过距离/时间=速度计算两点之间的速度,这样就可以动态生成线的粗细了。//计算线宽constcurrTime=Date.now()if(this.startTime!==0){constduration=currTime-this.startTime//传入倒数第二个和最后一个点,以及持续时间,会返回加速度constv=this.speed(this.ArrX[this.ArrX.length-2],this.ArrY[this.ArrY.length-2],this.ArrX[this.ArrX.length-1],this.ArrY[this.ArrY.length-1],duration)this.lineWidth=this.lineWidth/vif(this.lineWidth>25){this.lineWidth=25}if(this.lineWidth<1){this.lineWidth=1}}this.startTime=currTime可以点击下方链接下载文章相关附件:https://ost.51cto.com/resource/2313。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。
