<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用ArkTS中的canvas實現簽名板功能

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

作為一名web前端開發者,還在持續自學HarmonyOS,學習過程中我會分享自己做的一些工具,包括開發難點與解決方案,希望對各位HarmonyOS開發者有所啟發。

這次我要分享的是使用ArkTS中的canvas實現簽名板的功能,canvas畫布大家都很熟悉,我們會用它經常實現一些畫板或者圖表、表格之類的功能。canvas簽名板是我在開發APP過程中實現的一個功能,開發過程中也是遇到比較多的問題。我會按照以下幾點來講解開發整個過程:

屏幕旋轉

實現簽名板的第一個功能就是旋轉屏幕。旋轉屏幕在各種框架中都有不一樣的方式,比如:

在H5端,我們一般是使用CSS中的transform屬性中的rotate()方法來強制將網頁橫屏,然后實現一系列功能

在嵌套第三方APP中,我們一般是調用對應的SDK提供的方法,即可實現旋轉屏幕

.....

實現方式還有很多,各有千秋,相信HarmonyOS也會提供對應API方法來設置旋轉屏幕。

而我自己則是在頁面內通過 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%')
  }
}

(左右滑動查看更多)

以上就是我們實現簽名板的完整思路以及代碼了,有幾個需要注意的點是:

1. new PanGestureOptions實例的時候需要把distance設置小一點,值越小靈敏度就越高

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

這次的畫布簽名板的功能就分享這些,希望能夠幫助各位開發者,后續會繼續分享出更多在項目中經常用到的工具。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1241

    瀏覽量

    68668
  • 屏幕
    +關注

    關注

    6

    文章

    1162

    瀏覽量

    55412
  • 開發者
    +關注

    關注

    1

    文章

    512

    瀏覽量

    16640
  • HarmonyOS
    +關注

    關注

    79

    文章

    1912

    瀏覽量

    29449

原文標題:【開發者說】手把手教你使用ArkTS中的canvas實現簽名板功能

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙ArkTS開始實例:【canvas實現簽名功能

    使用ArkTS中的canvas實現簽名板的功能,canvas畫布大家都很熟悉,我們會用它經常
    的頭像 發表于 04-08 10:10 ?500次閱讀
    鴻蒙<b class='flag-5'>ArkTS</b>開始實例:【<b class='flag-5'>canvas</b><b class='flag-5'>實現</b><b class='flag-5'>簽名</b>板<b class='flag-5'>功能</b>】

    canvas繪制“飛機大戰”小游戲,真香!

    canvas的繪制方法 類Web開發范式,使用HML標簽文件進行布局搭建、CSS文件進行樣式描述,并通過JS語言進行邏輯處理。目前,JS語言的canvas繪圖功能已經基本上完善,下面
    發表于 02-09 17:26

    使用canvas畫隨機運動小球的教程

    ,可以先創建一個構造函數;給構造函數添加對應的屬性和方法;實例化出多個對象,并且保存在數組;遍歷每個對象,實現畫圓;間隔修改每個球的x,y值。先準備畫布確定對應的寬高:<canvas
    發表于 03-23 10:44

    如何用canvas組件實現在JS UI上畫出連續的線條?

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

    請問鴻蒙自定義控件如何刷新canvas?

      自定義控件通過addDrawTask在DrawTask中使用canvas進行繪制,需要實現一個動畫效果,需要刷新一下canvas,不知道通過哪個方法進行刷新
    發表于 05-31 16:16

    如何利用OpenHarmony ArkUI的Canvas組件實現涂鴉功能?

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

    如何利用OpenHarmony ArkUI的Canvas組件實現涂鴉功能?

    如何利用OpenHarmony ArkUI的Canvas組件實現涂鴉功能?簡介ArkUI是一套UI開發框架,提供了開發者進行應用UI開發時所需具備的能力。隨著OpenAtom OpenHarmony
    發表于 09-20 11:31

    HarmonyOS/OpenHarmony應用開發-ArkTS畫布組件Canvas

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

    OpenHarmony ArkTS工程目錄結構(Stage模型)

    操作,請參考歷史工程手動遷移。 build-profile.json5:應用級配置信息,包括簽名、產品配置等。 hvigorfile.ts:應用級編譯構建任務腳本。 二、ArkTS應用卡片相關模塊 圖片
    發表于 09-18 15:23

    在 HarmonyOS 上實現 ArkTS 與 H5 的交互

    介紹 本篇Codelab主要介紹H5如何調用原生側相關功能,并在回調獲取執行結果。以“獲取通訊錄”為示例分步講解JSBridge橋接的實現。 相關概念 Web組件:提供具有網頁顯示能力的Web組件
    發表于 11-13 17:08

    手把手教你使用ArkTScanvas實現簽名功能

    一、屏幕旋轉 ● 實現簽名的第一個功能就是旋轉屏幕。旋轉屏幕在各種框架中都有不一樣的方式,比如:在 H5 端,我們一般是使用 CSS
    發表于 12-20 10:33

    簽名簽名”之實現技術研究

    介紹“簽名簽名”,即筆跡數字簽名的概念,提出直接和需仲裁的“簽名簽名”之2種結構模式。針對簽名
    發表于 04-20 09:30 ?15次下載

    Schnorr簽名和ECDSA簽名技術介紹

    Schnorr簽名是一個使BCH區塊鏈實現技術領先的強大功能,因為Schnorr簽名方案直接促進了BCH的隱私性和交易能力。Schnorr簽名
    發表于 05-16 10:32 ?2688次閱讀

    html2canvas javascript實現頁面截圖的類庫

    ./oschina_soft/html2canvas.zip
    發表于 05-31 09:53 ?6次下載
    html2<b class='flag-5'>canvas</b> javascript<b class='flag-5'>實現</b>頁面截圖的類庫

    如何通過Canvas組件實現涂鴉功能

    新增的功能可以幫助開發者開發出更流暢、更美觀的應用。本篇文章將為大家分享如何通過Canvas組件實現涂鴉功能,用戶可以選擇空白畫布或者簡筆圖進行自由繪畫。
    的頭像 發表于 09-20 16:31 ?1947次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>