theme: greenwillow
簡介
大家好,我是一只會打代碼的羊。今天來分享一篇之前使用ArkTS API9版本實現的簽名板功能,目前鴻蒙已經推出API12了,對比API9的時候,現在實現一個功能太簡單了。這期主要講一下之前實現功能有多難受,以及如何實現。,現在這套代碼也是可以直接遷移到API12版本的。
對了,目前我們開發的圖表組件已經開源了,有興趣的伙伴可以參與一下。日常開發項目需要用圖表組件的也可以安裝立即使用,使用風格與Echarts完全一樣,但是效果還在完善,哈哈哈哈。不要嫌棄哈。覺得不錯的記得給開源項目點一個小星星哦。還可以加入交流群,互相學習。回歸正題,
官方文檔地址
:http://meichuang.org.cn/GettingStarted
Github地址
:https://github.com/Yuan-Mr/mcCharts
工具介紹
這次我要分享的是使用ArkTs中的canvas實現簽名板的功能,canvas畫布估計大家都很熟悉,我們會用它經常實現一些畫板或者圖表、表格之類的功能。canvas簽名板是我在開發APP過程中實現的一個功能,開發過程中也是遇到比較多的問題。我會按照以下幾點來講解開發整個過程:
一:痛點-屏幕旋轉
實現簽名板的第一個功能就是旋轉屏幕。旋轉屏幕在各種框架中都有不一樣的方式,比如:
· 在H5端,我們一般是使用CSS中的transform屬性中的rotate()方法來強制將網頁橫屏,然后實現一系列功能
· 在嵌套第三方APP中,我們一般是調用對應的SDK提供的方法,即可實現旋轉屏幕
· .....
實現方式應該還有很多吧,各有千秋,所以Harmony肯定也會提供對應API方法來設置旋轉屏幕。而在Harmony的開發文檔里面查找與使用相關方案的結果成為我第一個大痛點。我大概列一下我的經歷:
- 首先我在查閱文檔先看到: @ohos.display 這個API主要是用來獲取屏幕一些相關的設備信息。一開始我還以為可以設置,一般可以獲取就可以設置,翻閱到對應的屬性方法后,發現還是只能獲取不能設置,既然不行那就只能找其他API了。
- 后面查閱相關博客發現還可以通過module.json5中配置字段為"orientation": "landscape"就可以設置橫屏了,但是這個是全局的,我是需要針對某個頁面的。
- 最坑的在這個API:@ohos.settings。官網是這樣介紹的:“本模塊提供訪問設置數據項的能力”。那證明他是可以獲取或者修改的,我也查到了旋轉屏幕的屬性,文檔上是寫著可讀可寫,但是我引入對應修改方法之后一直報該屬性只可讀。一開始我以為寫錯了,查找了很多資料,都沒有找到相關案例。后面我又懷疑是我API版本的問題,把7.0跟6.0的版本都裝了一下,發現還是不行。我又換一個思路,因為之前一直都是直接預覽沒有用模擬器;把模擬器需要的依賴都裝了一遍,最后運行起來發現還是不行,崩潰了,搞了兩天。
最后我只能在博客尋找大佬的支持了,最終在大佬的提示下完成了這個功能。大佬說:“在頁面內通過 Window 對象的 setPreferredOrientation() 方法實現橫豎屏切換”。以下是我實現的完整代碼:
// 在EntryAbility.ts中獲取窗口實例并賦值給全局變量,如此所有頁面都可以通過全局// 變量去修改窗口信息,不需要重新獲取
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.getMainWindow((err, data) = > {
if (err.code) {
console.error('獲取失敗' + JSON.stringify(err));
return;
}
console.info('獲取主窗口的實例:' + JSON.stringify(data));
globalThis.windowClass = data // 賦值給全局變量windowClass
});
}
}
// 在具體頁面中的使用
import window from '@ohos.window';
@Entry
@Componentstruct SignatureBoard {
onPageShow() {
// 獲取旋轉的方向,具體可以查看對應文檔
let orientation = window.Orientation.LANDSCAPE_INVERTED;
try {
// 設置屏幕旋轉
globalThis.windowClass.setPreferredOrientation(orientation, (err) = > {});
} catch (exception) {
console.error('設置失敗: ' + JSON.stringify(exception));
}
}
}
好了,第一個痛點已經解決了。果然不懂就要問,或許在別人那里一下子就能幫你解決問題。還是得感謝大佬們!!!
二:技術點-canvas畫布
解決了我們的痛點,那接下來就要實現我們的簽名功能了,這個很簡單。因為在之前就已經開發過了,只要將對應的語法轉成ArkTs的語法就好了。接下來我直接上代碼解析:
2.1 按照官方文檔使用canvas組件
@Entry@Component
struct SignatureBoard {
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor('#fff')
.onReady(() = > {
})
}
.width('100%')
.height('100%')
}
}
2.2 設置畫筆的屬性以及綁定手勢功能。在js中我們基本都是使用鼠標事件來實現的,而在ArkTs中是通過手勢方法來監聽手指在屏幕上的操作,有很多種,大家需要用到的可以去查看對應的文檔
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor('#fff')
.onReady(() = > {
this.context.lineWidth = 3; // 設置畫筆的粗細
this.context.strokeStyle = "#000"; // 設置畫筆的顏色
// 還可以設置很多,根據自己業務需要
})
.gesture(
PanGesture(this.panOption)
.onActionStart((event: any) = > {
// 手指按下的時候
})
.onActionUpdate((event: any) = > {
// 手指移動的時候
})
.onActionEnd(() = > {
// 手指離開的時候
})
)
}
2.3 我們實現的手勢的綁定,那么就可以實現手指在屏幕上滑動之后畫布就繪畫出對應的軌跡路線了,這里將會使用到一些畫布的功能。
@Entry
@Componentstruct SignatureBoard {
private lastX: number = 0;
private lastY: number = 0;
private isDown: Boolean = false;
private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All, distance: 1 })
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
draw(startX, startY, endX, endY) {
// 起點
this.context.moveTo(startX, startY);
// 終點
this.context.lineTo(endX, endY);
// 調用 stroke,即可看到繪制的線條
this.context.stroke();
}
build() {
Column() {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor('#fff')
.onReady(() = > {
this.context.lineWidth = 3;
this.context.strokeStyle = "#000";
})
.gesture(
PanGesture(this.panOption)
.onActionStart((event: any) = > {
this.isDown = true;
// 按下時的點作為起點
this.lastX = event.localX;
this.lastY = event.localY;
// 創建一個新的路徑
this.context.beginPath();
})
.onActionUpdate((event: any) = > {
// 沒有按下就不管
if (!this.isDown) return;
const offsetX = event.localX
const offsetY = event.localY
// 調用繪制方法
this.draw(this.lastX, this.lastY, offsetX, offsetY);
// 把當前移動時的坐標作為下一次的繪制路徑的起點
this.lastX = offsetX;
this.lastY = offsetY;
})
.onActionEnd(() = > {
this.isDown = false;
// 關閉路徑
this.context.closePath();
})
)
}
.width('100%')
.height('100%')
}
}
以上就是我們實現簽名板的完整思路以及代碼了,有幾個需要注意的點是:
- new PanGestureOptions實例的時候需要把distance設置小一點,值越小靈敏度就越高
- PanGesture的回調方法中event參數,官方默認給的屬性類型為GestureEvent。但是我在編輯器源碼中查看該屬性沒有我們定義我們想要的localX、localY,但是實際是有返回的,如果直接用編輯器會報錯。所以需要將event定為any類型,這樣就可以獲取且不報錯了。不過我不知道有沒有其他方案哈。懂得可以在評論區告訴我
這次的畫布簽名板的功能就講到這里了,希望能夠幫助你們,后續我還會分享出更多在項目中經常用到的工具,感謝大家觀看。
審核編輯 黃宇
-
HarmonyOS
+關注
關注
79文章
2005瀏覽量
31670
發布評論請先 登錄
相關推薦
使用ArkTS中的canvas實現簽名板功能
2024款鴻蒙OS 最新HarmonyOS Next_HarmonyOS4.0系列教程分享
HarmonyOS NEXT 應用開發練習:智能視頻推薦
HarmonyOS NEXT 原生應用/元服務調試概述
HarmonyOS NEXT新能力,一站式高效開發HarmonyOS應用
HarmonyOS NEXT新能力,一站式高效開發HarmonyOS應用
HarmonyOS NEXT新能力,一站式高效開發HarmonyOS應用
淘寶與華為合作將基于HarmonyOS NEXT啟動鴻蒙原生應用開發
HarmonyOS NEXT上手體驗:無法使用原生安卓應用
HDC 2024上,HarmonyOS NEXT有哪些精彩亮點值得期待?

華為HarmonyOS NEXT 10月8日開啟公測

評論