OpenHarmony學生挑戰(zhàn)賽項目經(jīng)驗分享
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
背景
現(xiàn)在的電子設(shè)備太普及,用筆的頻率大大降低,導(dǎo)致現(xiàn)在很多人 提筆忘字、寫字“丑 ”、錯字、用法不當、頻頻出現(xiàn)。文字是我國傳統(tǒng)文化最為重要悠久的積淀,包含前人無數(shù)智慧和經(jīng)驗,我們不應(yīng)舍棄。于是,我開發(fā)多功能手寫板,并且實現(xiàn)了練字功能。多功能手寫板的存在,可以告別紙張字帖,實現(xiàn)字帖自由,能在設(shè)備上臨摹。很多人筆畫不規(guī)范,寫字會有倒筆順的現(xiàn)象,這直接導(dǎo)致書寫不美觀,針對這個問題,實現(xiàn)了筆順糾錯,評分功能。
符合的聯(lián)合國17項可持續(xù)發(fā)展目標
優(yōu)質(zhì)教育。
標準設(shè)備環(huán)境準備
以潤和大禹系列HH-SCDAYU200開發(fā)板套件為例
- 開發(fā)板上新 | RK3568開發(fā)板上絲滑體驗OpenHarmony標準系統(tǒng)
應(yīng)用編譯環(huán)境準備
- 下載DevEco Studio??下載地址??。
- SDK 版本 :OpenHarmony SDK API 8,請參考??配置OpenHarmony SDK??,完成DevEco Studio的安裝和開發(fā)環(huán)境配置。
目錄結(jié)構(gòu)
└─src
├─main
│ │ config.json // 應(yīng)用配置文件
│ │
│ ├─js
│ │ └─MainAbility
│ │ │ app.js // 應(yīng)用程序主入口
│ │ │
│ │ ├─common
│ │ │ ├─components
│ │ │ │ ├─Draw // 繪畫模塊
│ │ │ │ │ index.css
│ │ │ │ │ index.hml
│ │ │ │ │ index.js
│ │ │ │ │
│ │ │ │ ├─layout // tab欄
│ │ │ │ │ layout.css
│ │ │ │ │ layout.hml
│ │ │ │ │ layout.js
│ │ │ │ │
│ │ │ │ ├─Note // 筆記模塊
│ │ │ │ │ index.css
│ │ │ │ │ index.hml
│ │ │ │ │ index.js
│ │ │ │ │
│ │ │ │ └─Write // 練字模塊
│ │ │ │ index.css
│ │ │ │ index.hml
│ │ │ │ index.js
│ │ │ │
│ │ │ └─images
│ │ └─pages
│ │ └─index // 首頁
│ │ index.css
│ │ index.hml
│ │ index.js
│ │
│ └─resources
│ ├─base
│ │ ├─element
│ │ │ color.json
│ │ │ string.json
│ │ │
│ │ └─media
│ │ icon.png
│ │
│ └─rawfile
功能模塊
1、練字
模擬寫字,通過速度實現(xiàn)畫筆粗細,從而模擬寫字效果。筆順檢測,通過提前設(shè)置寫字位置,實現(xiàn)用戶筆順檢測。評分功能,當用戶寫完時,點擊保存,系統(tǒng)會根據(jù)書寫的準確性進行評分。
2、繪畫
用戶可以選擇不同粗細的畫筆,選擇不同顏色的畫筆,進行繪圖。還設(shè)置了一些功能鍵,方便用戶使用,如:清空、橡皮擦、存儲、回退、前進。
3、筆記
傳入富文本,通過richtextAPI,解析富文本,渲染到屏幕中,用戶可以通過點擊右側(cè)的小圖標,進入筆記功能,可以對文章進行批注。
關(guān)鍵代碼解讀
1、繪制原理
使用前,需要線了解canvas組件,可以參考harmonyOS開發(fā)者文檔。
首先,我們需要將canvas上下文對象,需要在觸摸移動事件中綁定,因為我們是通過觸摸來生成對應(yīng)線條的。
繪制直線,通常使用moveTo ()與lineTo ()兩個方法。. moveTo ()方法用于將畫筆移至指定點并以改點為直線的開始點,lineTo ()則為結(jié)束點。
const el = this.$refs.canvas;
this.ctx = el.getContext('2d')
this.ctx.lineWidth =this.lineWidth/2
this.ctx.beginPath()
// 向線條的每個末端添加圓形線帽。
this.ctx.lineCap = 'square'
// 每次將數(shù)組中最后一個值取出,作為起始點
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)
將數(shù)組中的最后一個值取出,作為moveTo的坐標,將鼠標移動后的點作為lineTo的坐標,然后再通過stroke就能繪制出圖像。
2、線條粗細
想要通過速度來計算線條粗細,那么可以是需要獲取兩點之間的時間,通過時間和距離得到速度。
當觸發(fā)touchmove事件,將當前時間戳存儲起來,通過上一次觸發(fā)事件獲得的時間-當前觸發(fā)事件獲得的時間,就可以得到兩次觸發(fā)事件的事件間隔,此時我們就獲得了兩點之間的時間。
再計算兩點之間的距離(平方和再開根號),通過 路程/時間 = 速度計算出兩點之間的速度,從而可以動態(tài)生成線條粗細。
// 計算線條粗細
const currTime = Date.now()
if(this.startTime !== 0){
const duration = currTime - this.startTime
// 傳入倒數(shù)第二個點和最后一個點,和持續(xù)時間,會返回加速度
const v = 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/v
if(this.lineWidth>25){
this.lineWidth = 25
}
if(this.lineWidth<1){
this.lineWidth = 1
}
}
this.startTime = currTime
文章相關(guān)附件可以點擊下面的原文鏈接前往下載:
https://ost.51cto.com/resource/2313。