0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用ArkTS中的canvas實(shí)現(xiàn)簽名板功能

HarmonyOS開發(fā)者 ? 來源:HarmonyOS開發(fā)者 ? 2023-12-20 09:46 ? 次閱讀

作為一名web前端開發(fā)者,還在持續(xù)自學(xué)HarmonyOS,學(xué)習(xí)過程中我會(huì)分享自己做的一些工具,包括開發(fā)難點(diǎn)與解決方案,希望對(duì)各位HarmonyOS開發(fā)者有所啟發(fā)。

這次我要分享的是使用ArkTS中的canvas實(shí)現(xiàn)簽名板的功能,canvas畫布大家都很熟悉,我們會(huì)用它經(jīng)常實(shí)現(xiàn)一些畫板或者圖表、表格之類的功能。canvas簽名板是我在開發(fā)APP過程中實(shí)現(xiàn)的一個(gè)功能,開發(fā)過程中也是遇到比較多的問題。我會(huì)按照以下幾點(diǎn)來講解開發(fā)整個(gè)過程:

屏幕旋轉(zhuǎn)

實(shí)現(xiàn)簽名板的第一個(gè)功能就是旋轉(zhuǎn)屏幕。旋轉(zhuǎn)屏幕在各種框架中都有不一樣的方式,比如:

在H5端,我們一般是使用CSS中的transform屬性中的rotate()方法來強(qiáng)制將網(wǎng)頁橫屏,然后實(shí)現(xiàn)一系列功能

在嵌套第三方APP中,我們一般是調(diào)用對(duì)應(yīng)的SDK提供的方法,即可實(shí)現(xiàn)旋轉(zhuǎn)屏幕

.....

實(shí)現(xiàn)方式還有很多,各有千秋,相信HarmonyOS也會(huì)提供對(duì)應(yīng)API方法來設(shè)置旋轉(zhuǎn)屏幕。

而我自己則是在頁面內(nèi)通過 Window 對(duì)象的 setPreferredOrientation() 方法實(shí)現(xiàn)橫豎屏切換。以下是我實(shí)現(xiàn)的完整代碼:

// 在EntryAbility.ts中獲取窗口實(shí)例并賦值給全局變量,如此所有頁面都可以通過全局// 變量去修改窗口信息,不需要重新獲取
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('獲取主窗口的實(shí)例:' + JSON.stringify(data));
      globalThis.windowClass = data // 賦值給全局變量windowClass
    });
  }
}


// 在具體頁面中的使用
import window from '@ohos.window';
@Entry
@Componentstruct SignatureBoard {


  onPageShow() {
// 獲取旋轉(zhuǎn)的方向,具體可以查看對(duì)應(yīng)文檔
    let orientation = window.Orientation.LANDSCAPE_INVERTED;
    try {
//設(shè)置屏幕旋轉(zhuǎn)
globalThis.windowClass.setPreferredOrientation(orientation,(err)=>{});
    } catch (exception) {
      console.error('設(shè)置失敗: ' + JSON.stringify(exception));
    }
  }
}

(左右滑動(dòng)查看更多)



canvas畫布

解決了屏幕旋轉(zhuǎn)問題,接下來實(shí)現(xiàn)簽名功能。因?yàn)樵谥熬鸵呀?jīng)開發(fā)過,只要將對(duì)應(yīng)的語法轉(zhuǎn)成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%')
  }
}
(左右滑動(dòng)查看更多)

2.2 設(shè)置畫筆的屬性以及綁定手勢(shì)功能。在js中我們基本都是使用鼠標(biāo)事件來實(shí)現(xiàn)的,而在ArkTS中是通過手勢(shì)方法來監(jiān)聽手指在屏幕上的操作,有很多種,大家需要用到的可以去查看對(duì)應(yīng)的文檔。

build() {
    Column() {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#fff')
        .onReady(() => {
          this.context.lineWidth = 3; // 設(shè)置畫筆的粗細(xì)
          this.context.strokeStyle = "#000"; // 設(shè)置畫筆的顏色
          // 還可以設(shè)置很多,根據(jù)自己業(yè)務(wù)需要
        })
        .gesture(
          PanGesture(this.panOption)
            .onActionStart((event: any) => {
               // 手指按下的時(shí)候
            })
            .onActionUpdate((event: any) => {
               // 手指移動(dòng)的時(shí)候
            })
            .onActionEnd(() => {
               // 手指離開的時(shí)候
            })
        )
}

(左右滑動(dòng)查看更多)

2.3 我們實(shí)現(xiàn)的手勢(shì)的綁定,那么就可以實(shí)現(xiàn)手指在屏幕上滑動(dòng)之后畫布就繪畫出對(duì)應(yīng)的軌跡路線了,這里將會(huì)使用到一些畫布的功能。

@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) {
    // 起點(diǎn)
    this.context.moveTo(startX, startY);
    // 終點(diǎn)
    this.context.lineTo(endX, endY);
    // 調(diào)用 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;
              // 按下時(shí)的點(diǎn)作為起點(diǎn)
              this.lastX = event.localX;
              this.lastY = event.localY;
              // 創(chuàng)建一個(gè)新的路徑
              this.context.beginPath();
            })
            .onActionUpdate((event: any) => {
              // 沒有按下就不管
              if (!this.isDown) return;
              const offsetX = event.localX
              const offsetY = event.localY
              // 調(diào)用繪制方法
              this.draw(this.lastX, this.lastY, offsetX, offsetY);
              // 把當(dāng)前移動(dòng)時(shí)的坐標(biāo)作為下一次的繪制路徑的起點(diǎn)
              this.lastX = offsetX;
              this.lastY = offsetY;
            })
            .onActionEnd(() => {
              this.isDown = false;
              // 關(guān)閉路徑
              this.context.closePath();
            })
        )
    }
    .width('100%')
    .height('100%')
  }
}

(左右滑動(dòng)查看更多)

以上就是我們實(shí)現(xiàn)簽名板的完整思路以及代碼了,有幾個(gè)需要注意的點(diǎn)是:

1. new PanGestureOptions實(shí)例的時(shí)候需要把distance設(shè)置小一點(diǎn),值越小靈敏度就越高

2. PanGesture的回調(diào)方法中event參數(shù),官方默認(rèn)給的屬性類型為GestureEvent。但是我在編輯器源碼中查看該屬性沒有我們定義我們想要的localX、localY,但是實(shí)際是有返回的,如果直接用編輯器會(huì)報(bào)錯(cuò)。所以需要將event定為any類型,這樣就可以獲取且不報(bào)錯(cuò)了。

這次的畫布簽名板的功能就分享這些,希望能夠幫助各位開發(fā)者,后續(xù)會(huì)繼續(xù)分享出更多在項(xiàng)目中經(jīng)常用到的工具。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1254

    瀏覽量

    69202
  • 屏幕
    +關(guān)注

    關(guān)注

    6

    文章

    1185

    瀏覽量

    55669
  • 開發(fā)者
    +關(guān)注

    關(guān)注

    1

    文章

    541

    瀏覽量

    16956
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1954

    瀏覽量

    29897

原文標(biāo)題:【開發(fā)者說】手把手教你使用ArkTS中的canvas實(shí)現(xiàn)簽名板功能

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙ArkTS開始實(shí)例:【canvas實(shí)現(xiàn)簽名功能

    使用ArkTScanvas實(shí)現(xiàn)簽名功能
    的頭像 發(fā)表于 04-08 10:10 ?812次閱讀
    鴻蒙<b class='flag-5'>ArkTS</b>開始實(shí)例:【<b class='flag-5'>canvas</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>簽名</b><b class='flag-5'>板</b><b class='flag-5'>功能</b>】

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(五)

    :錯(cuò)誤 ArkTS不支持對(duì)象類型的構(gòu)造簽名。改用類。 TypeScript class SomeObject {} type SomeConstructor = { new (s: string
    發(fā)表于 07-17 17:24

    如何用canvas組件實(shí)現(xiàn)在JS UI上畫出連續(xù)的線條?

    在使用框架的過程,我想使用canvas這個(gè)畫布組件來實(shí)現(xiàn)【筆】的功能,可以在JS UI上畫出連續(xù)的線條,如下圖:仔細(xì)查看文檔很多JS U
    發(fā)表于 04-02 10:47

    如何利用OpenHarmony ArkUI的Canvas組件實(shí)現(xiàn)涂鴉功能?

    新的組件,例如Canvas、OffscreenCanvas、XComponent組件等。新增的功能可以幫助開發(fā)者開發(fā)出更流暢、更美觀的應(yīng)用。本篇文章將為大家分享如何通過Canvas組件實(shí)現(xiàn)
    發(fā)表于 09-17 16:41

    如何利用OpenHarmony ArkUI的Canvas組件實(shí)現(xiàn)涂鴉功能?

    如何利用OpenHarmony ArkUI的Canvas組件實(shí)現(xiàn)涂鴉功能?簡介ArkUI是一套UI開發(fā)框架,提供了開發(fā)者進(jìn)行應(yīng)用UI開發(fā)時(shí)所需具備的能力。隨著OpenAtom OpenHarmony
    發(fā)表于 09-20 11:31

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-ArkTS畫布組件Canvas

    提供畫布組件,用于自定義繪制圖形。該組件從API Version 8開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨(dú)標(biāo)記該內(nèi)容的起始版本。子組件,不支持。接口: Canvas(context
    發(fā)表于 02-27 09:49

    手把手教你使用ArkTScanvas實(shí)現(xiàn)簽名功能

    一、屏幕旋轉(zhuǎn) ● 實(shí)現(xiàn)簽名的第一個(gè)功能就是旋轉(zhuǎn)屏幕。旋轉(zhuǎn)屏幕在各種框架中都有不一樣的方式,比如:在 H5 端,我們一般是使用 CSS
    發(fā)表于 12-20 10:33

    簽名簽名”之實(shí)現(xiàn)技術(shù)研究

    介紹“簽名簽名”,即筆跡數(shù)字簽名的概念,提出直接和需仲裁的“簽名簽名”之2種結(jié)構(gòu)模式。針對(duì)簽名
    發(fā)表于 04-20 09:30 ?15次下載

    數(shù)字簽名,什么是數(shù)字簽名

    數(shù)字簽名,什么是數(shù)字簽名 在數(shù)字簽名技術(shù)出現(xiàn)之前,曾經(jīng)出現(xiàn)過一種“數(shù)字化簽名”技術(shù),簡單地說就是在手寫
    發(fā)表于 04-03 16:00 ?6312次閱讀

    Schnorr簽名和ECDSA簽名技術(shù)介紹

    Schnorr簽名是一個(gè)使BCH區(qū)塊鏈實(shí)現(xiàn)技術(shù)領(lǐng)先的強(qiáng)大功能,因?yàn)镾chnorr簽名方案直接促進(jìn)了BCH的隱私性和交易能力。Schnorr簽名
    發(fā)表于 05-16 10:32 ?2759次閱讀

    數(shù)字簽名技術(shù)的環(huán)簽名和盲簽名是什么

    環(huán)簽名( Ring Signature ) 這個(gè)詞是 2001 年 Rivest、Shamir 和 Tauman 這三位密碼學(xué)家提出的,它是一種數(shù)字簽名方案,也是一種簡化的群簽名,在環(huán)簽名
    發(fā)表于 08-08 10:48 ?5291次閱讀

    canvas基礎(chǔ)繪制方法介紹

      canvas是ArkUI開發(fā)框架里的畫布組件,常用于自定義繪制圖形。因?yàn)槠漭p量、靈活、高效等優(yōu)點(diǎn),被廣泛應(yīng)用于UI界面開發(fā)。本期,我們將為大家介紹canvas組件的使用。
    的頭像 發(fā)表于 02-12 10:09 ?4037次閱讀
    <b class='flag-5'>canvas</b>基礎(chǔ)繪制方法介紹

    canvas組件的使用介紹

    canvas是ArkUI開發(fā)框架里的畫布組件,常用于自定義繪制圖形。因?yàn)槠漭p量、靈活、高效等優(yōu)點(diǎn),被廣泛應(yīng)用于UI界面開發(fā)。本期,我們將為大家介紹canvas組件的使用。
    的頭像 發(fā)表于 03-18 11:16 ?2643次閱讀

    如何通過Canvas組件實(shí)現(xiàn)涂鴉功能

    新增的功能可以幫助開發(fā)者開發(fā)出更流暢、更美觀的應(yīng)用。本篇文章將為大家分享如何通過Canvas組件實(shí)現(xiàn)涂鴉功能,用戶可以選擇空白畫布或者簡筆圖進(jìn)行自由繪畫。
    的頭像 發(fā)表于 09-20 16:31 ?2434次閱讀

    柜臺(tái)電子簽名應(yīng)該怎么挑選?電子簽批推薦

    電子簽名是通過電子感應(yīng)技術(shù),將手寫筆跡以電子形式生成、制作與保存的電子;隨著電子合同使用越來越廣泛,可靠的電子簽名也擁有和紙質(zhì)簽名同等的
    的頭像 發(fā)表于 10-31 17:33 ?1251次閱讀
    柜臺(tái)電子<b class='flag-5'>簽名</b><b class='flag-5'>板</b>應(yīng)該怎么挑選?電子簽批<b class='flag-5'>板</b>推薦