在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

使用HarmonyOS NEXT實現簽名板的功能

陳姚豐 ? 來源:jf_83680738 ? 作者:jf_83680738 ? 2025-03-16 16:00 ? 次閱讀
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的開發文檔里面查找與使用相關方案的結果成為我第一個大痛點。我大概列一下我的經歷:

  1. 首先我在查閱文檔先看到: @ohos.display 這個API主要是用來獲取屏幕一些相關的設備信息。一開始我還以為可以設置,一般可以獲取就可以設置,翻閱到對應的屬性方法后,發現還是只能獲取不能設置,既然不行那就只能找其他API了。
  2. 后面查閱相關博客發現還可以通過module.json5中配置字段為"orientation": "landscape"就可以設置橫屏了,但是這個是全局的,我是需要針對某個頁面的。
  3. 最坑的在這個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%')
  }
}

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

  1. new PanGestureOptions實例的時候需要把distance設置小一點,值越小靈敏度就越高
  2. PanGesture的回調方法中event參數,官方默認給的屬性類型為GestureEvent。但是我在編輯器源碼中查看該屬性沒有我們定義我們想要的localX、localY,但是實際是有返回的,如果直接用編輯器會報錯。所以需要將event定為any類型,這樣就可以獲取且不報錯了。不過我不知道有沒有其他方案哈。懂得可以在評論區告訴我

這次的畫布簽名板的功能就講到這里了,希望能夠幫助你們,后續我還會分享出更多在項目中經常用到的工具,感謝大家觀看。

審核編輯 黃宇

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

    關注

    79

    文章

    2005

    瀏覽量

    31670
收藏 人收藏

    評論

    相關推薦

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

    作為一名web前端開發者,還在持續自學HarmonyOS,學習過程中我會分享自己做的一些工具,包括開發難點與解決方案,希望對各位HarmonyOS開發者有所啟發。
    的頭像 發表于 12-20 09:46 ?947次閱讀

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

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

    2024款鴻蒙OS 最新HarmonyOS Next_HarmonyOS4.0系列教程分享

    Next_HarmonyOS4.0系列教程由業內大神錄制于2024年,包括:HarmonyOS ArkTs、ArkUI、ArkTs Api、ArkTs Native、OpenHarmony ArkUI-X跨平臺的基本用法以及項目
    發表于 02-28 10:29

    HarmonyOS Next MQTT演示

    HarmonyOS Next MQTT演示
    發表于 11-07 16:54

    HarmonyOS NEXT 應用開發練習:智能視頻推薦

    一、整體思路 本DEMO展示了如何在HarmonyOS NEXT平臺上開發一個智能視頻推薦應用。應用通過模擬的用戶偏好數據,為用戶推薦可能感興趣的視頻。用戶可以通過滑動屏幕查看推薦的視頻列表,并點擊
    發表于 01-02 16:26

    HarmonyOS NEXT 原生應用/元服務調試概述

    開發者更方便、高效地調試應用/元服務。 HarmonyOS應用/元服務調試支持使用真機設備、模擬器、預覽器調試。接下來以使用真機設備為例進行說明,詳細的調試流程如下圖所示: 1.配置簽名信息:使用真機設
    發表于 02-26 11:03

    HarmonyOS NEXT新能力,一站式高效開發HarmonyOS應用

    NEXT還將聲明式開發延展到了動效開發領域,由數據驅動動畫設計,帶來物理世界與UI動效的橋梁。 最后,HarmonyOS的運行引擎助力應用實現更高性能。本次ArkTS帶來了更好的生產力與性能,通過支持
    發表于 08-14 15:08

    HarmonyOS NEXT新能力,一站式高效開發HarmonyOS應用

    2023年8月4日的華為開發者大會2023(HDC.Together)拉開帷幕,伴隨著HarmonyOS 4的發布,華為向開發者發布了匯聚所有最新開發能力的HarmonyOS NEXT開發者預覽版
    的頭像 發表于 08-09 17:16 ?1413次閱讀

    HarmonyOS NEXT新能力,一站式高效開發HarmonyOS應用

    2023年8月6日華為開發者大會2023(HDC.Together)圓滿收官,伴隨著HarmonyOS 4的發布,華為向開發者發布了匯聚所有最新開發能力的HarmonyOS NEXT開發者預覽版,并
    的頭像 發表于 08-11 12:10 ?1227次閱讀

    淘寶與華為合作將基于HarmonyOS NEXT啟動鴻蒙原生應用開發

    1月25日,淘寶與華為舉辦鴻蒙合作簽約儀式,宣布將基于HarmonyOS NEXT啟動鴻蒙原生應用開發。
    的頭像 發表于 01-26 16:14 ?1337次閱讀

    HarmonyOS NEXT上手體驗:無法使用原生安卓應用

    該博主強調,HarmonyOS NEXT 對原生的安卓應用不再兼容,原因是本地數據過多可能導致用戶體驗不佳。“例如微信聊天記錄、筆記軟件等需要盡快找到解決方案,以確保用戶盡可能少地受到影響。”
    的頭像 發表于 04-15 14:22 ?2351次閱讀

    HDC 2024上,HarmonyOS NEXT有哪些精彩亮點值得期待?

    6月21日至6月23日,備受矚目的HDC2024華為開發者大會將在松山湖盛大舉辦。近日,官方對外發出了亮點日程海報,圍繞HarmonyOS?NEXT,大會都將帶來哪些精彩內容呢?讓我們一探
    的頭像 發表于 06-19 17:02 ?700次閱讀
    HDC 2024上,<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>有哪些精彩亮點值得期待?

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

    華為宣布,萬眾矚目的HarmonyOS NEXT操作系統將于10月8日正式開啟公測,標志著這一創新力作即將與廣大用戶見面。HarmonyOS NEXT作為華為自研操作系統的最新成果,不
    的頭像 發表于 09-24 15:41 ?1144次閱讀
    華為<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b> 10月8日開啟公測

    華為大氣啊!HarmonyOS NEXT公測發福利~這個可以有

    HarmonyOS NEXT火熱公測中,首批100萬名公測用戶速來領取多重權益!這波福利不錯
    的頭像 發表于 11-06 10:26 ?558次閱讀
    華為大氣啊!<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>公測發福利~這個可以有

    HarmonyOS Next V2 @Event

    HarmonyOS Next V2 @Event 背景 在上一節中,我們針對父子組件,講了關于傳遞數據的知識。我們了解到 @Local 是管理自己內部的數據的, @Param 是負責接收父組件的數據
    的頭像 發表于 03-31 09:42 ?127次閱讀
    主站蜘蛛池模板: 爽好舒服老师快点 | 欧美午夜性刺激在线观看免费 | 亚洲精品午夜视频 | 在线观看一级毛片 | 日韩爽片| 日日做日日摸夜夜爽 | 欧美爱爱帝国综合社区 | 最新四虎4hu影库地址在线 | 亚洲一区二区福利视频 | www.色.con| 亚洲 欧美 成人 | 成人深夜视频 | 午夜爽爽性刺激一区二区视频 | 午夜影院黄色片 | 特别黄的免费视频大片 | 天堂最新在线资源 | 午夜毛片不卡高清免费 | 色噜噜狠狠成人网 | 人人干人人干人人干 | 午夜性刺激免费视频观看不卡专区 | 久久亚洲国产午夜精品理论片 | 天堂资源在线种子资源 | 免费视频性 | 男男宿舍高h炒肉bl 男男污肉高h坐便器调教 | 亚洲第一永久在线观看 | 特级毛片免费视频播放 | 日本aaaaa特黄毛片 | 四虎影院在线免费 | 在线精品小视频 | 国产福利在线观看你懂的 | 国产一区二区在线不卡 | 久久精品国产2020观看福利色 | 欧美性hd| 农村妇女高清毛片一级 | 欧美视频一区二区三区在线观看 | 美女视频很黄很a免费国产 美女视频很黄很暴黄是免费的 | 国产午夜免费视频 | 久久网综合 | 女人张开腿给男人桶爽免费 | 日本黄视频在线观看 | 欧美成网 |