chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

使用HarmonyOS NEXT實(shí)現(xiàn)簽名板的功能

陳姚豐 ? 來(lái)源:jf_83680738 ? 作者:jf_83680738 ? 2025-03-16 16:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

theme: greenwillow

簡(jiǎn)介

大家好,我是一只會(huì)打代碼的羊。今天來(lái)分享一篇之前使用ArkTS API9版本實(shí)現(xiàn)的簽名板功能,目前鴻蒙已經(jīng)推出API12了,對(duì)比API9的時(shí)候,現(xiàn)在實(shí)現(xiàn)一個(gè)功能太簡(jiǎn)單了。這期主要講一下之前實(shí)現(xiàn)功能有多難受,以及如何實(shí)現(xiàn)。,現(xiàn)在這套代碼也是可以直接遷移到API12版本的。

對(duì)了,目前我們開(kāi)發(fā)的圖表組件已經(jīng)開(kāi)源了,有興趣的伙伴可以參與一下。日常開(kāi)發(fā)項(xiàng)目需要用圖表組件的也可以安裝立即使用,使用風(fēng)格與Echarts完全一樣,但是效果還在完善,哈哈哈哈。不要嫌棄哈。覺(jué)得不錯(cuò)的記得給開(kāi)源項(xiàng)目點(diǎn)一個(gè)小星星哦。還可以加入交流群,互相學(xué)習(xí)?;貧w正題,

官方文檔地址:http://meichuang.org.cn/GettingStarted

Github地址:https://github.com/Yuan-Mr/mcCharts

工具介紹

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

一:痛點(diǎn)-屏幕旋轉(zhuǎn)

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

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

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

· .....

實(shí)現(xiàn)方式應(yīng)該還有很多吧,各有千秋,所以Harmony肯定也會(huì)提供對(duì)應(yīng)API方法來(lái)設(shè)置旋轉(zhuǎn)屏幕。而在Harmony的開(kāi)發(fā)文檔里面查找與使用相關(guān)方案的結(jié)果成為我第一個(gè)大痛點(diǎn)。我大概列一下我的經(jīng)歷:

  1. 首先我在查閱文檔先看到: @ohos.display 這個(gè)API主要是用來(lái)獲取屏幕一些相關(guān)的設(shè)備信息。一開(kāi)始我還以為可以設(shè)置,一般可以獲取就可以設(shè)置,翻閱到對(duì)應(yīng)的屬性方法后,發(fā)現(xiàn)還是只能獲取不能設(shè)置,既然不行那就只能找其他API了。
  2. 后面查閱相關(guān)博客發(fā)現(xiàn)還可以通過(guò)module.json5中配置字段為"orientation": "landscape"就可以設(shè)置橫屏了,但是這個(gè)是全局的,我是需要針對(duì)某個(gè)頁(yè)面的。
  3. 最坑的在這個(gè)API:@ohos.settings。官網(wǎng)是這樣介紹的:“本模塊提供訪問(wèn)設(shè)置數(shù)據(jù)項(xiàng)的能力”。那證明他是可以獲取或者修改的,我也查到了旋轉(zhuǎn)屏幕的屬性,文檔上是寫(xiě)著可讀可寫(xiě),但是我引入對(duì)應(yīng)修改方法之后一直報(bào)該屬性只可讀。一開(kāi)始我以為寫(xiě)錯(cuò)了,查找了很多資料,都沒(méi)有找到相關(guān)案例。后面我又懷疑是我API版本的問(wèn)題,把7.0跟6.0的版本都裝了一下,發(fā)現(xiàn)還是不行。我又換一個(gè)思路,因?yàn)橹耙恢倍际侵苯宇A(yù)覽沒(méi)有用模擬器;把模擬器需要的依賴都裝了一遍,最后運(yùn)行起來(lái)發(fā)現(xiàn)還是不行,崩潰了,搞了兩天。

最后我只能在博客尋找大佬的支持了,最終在大佬的提示下完成了這個(gè)功能。大佬說(shuō):“在頁(yè)面內(nèi)通過(guò) Window 對(duì)象的 setPreferredOrientation() 方法實(shí)現(xiàn)橫豎屏切換”。以下是我實(shí)現(xiàn)的完整代碼:

// 在EntryAbility.ts中獲取窗口實(shí)例并賦值給全局變量,如此所有頁(yè)面都可以通過(guò)全局// 變量去修改窗口信息,不需要重新獲取
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
    });
  }
}
// 在具體頁(yè)面中的使用
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));
    }
  }
}

好了,第一個(gè)痛點(diǎn)已經(jīng)解決了。果然不懂就要問(wèn),或許在別人那里一下子就能幫你解決問(wèn)題。還是得感謝大佬們!??!

二:技術(shù)點(diǎn)-canvas畫(huà)布

解決了我們的痛點(diǎn),那接下來(lái)就要實(shí)現(xiàn)我們的簽名功能了,這個(gè)很簡(jiǎn)單。因?yàn)樵谥熬鸵呀?jīng)開(kāi)發(fā)過(guò)了,只要將對(duì)應(yīng)的語(yǔ)法轉(zhuǎn)成ArkTs的語(yǔ)法就好了。接下來(lái)我直接上代碼解析:

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

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

2.3 我們實(shí)現(xiàn)的手勢(shì)的綁定,那么就可以實(shí)現(xiàn)手指在屏幕上滑動(dòng)之后畫(huà)布就繪畫(huà)出對(duì)應(yīng)的軌跡路線了,這里將會(huì)使用到一些畫(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) = > {
              // 沒(méi)有按下就不管
              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%')
  }
}

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

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

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

審核編輯 黃宇

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

    關(guān)注

    80

    文章

    2153

    瀏覽量

    36057
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    作為一名web前端開(kāi)發(fā)者,還在持續(xù)自學(xué)HarmonyOS,學(xué)習(xí)過(guò)程中我會(huì)分享自己做的一些工具,包括開(kāi)發(fā)難點(diǎn)與解決方案,希望對(duì)各位HarmonyOS開(kāi)發(fā)者有所啟發(fā)。
    的頭像 發(fā)表于 12-20 09:46 ?1435次閱讀

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

    使用ArkTS中的canvas實(shí)現(xiàn)簽名功能,canvas畫(huà)布大家都很熟悉,我們會(huì)用它經(jīng)常實(shí)現(xiàn)一些畫(huà)板或者圖表、表格之類的
    的頭像 發(fā)表于 04-08 10:10 ?1866次閱讀
    鴻蒙ArkTS開(kāi)始實(shí)例:【canvas<b class='flag-5'>實(shí)現(xiàn)</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系列教程由業(yè)內(nèi)大神錄制于2024年,包括:HarmonyOS ArkTs、ArkUI、ArkTs Api、ArkTs Native、OpenHarmony ArkUI-X跨平臺(tái)的基本用法以及項(xiàng)目
    發(fā)表于 02-28 10:29

    HarmonyOS Next MQTT演示

    HarmonyOS Next MQTT演示
    發(fā)表于 11-07 16:54

    HarmonyOS NEXT 應(yīng)用開(kāi)發(fā)練習(xí):智能視頻推薦

    一、整體思路 本DEMO展示了如何在HarmonyOS NEXT平臺(tái)上開(kāi)發(fā)一個(gè)智能視頻推薦應(yīng)用。應(yīng)用通過(guò)模擬的用戶偏好數(shù)據(jù),為用戶推薦可能感興趣的視頻。用戶可以通過(guò)滑動(dòng)屏幕查看推薦的視頻列表,并點(diǎn)擊
    發(fā)表于 01-02 16:26

    HarmonyOS NEXT】多目標(biāo)產(chǎn)物構(gòu)建實(shí)踐

    ;release\", // release類型簽名配置 \"type\": \"HarmonyOS\", \"material\"
    發(fā)表于 05-16 16:22

    HarmonyOS NEXT新能力,一站式高效開(kāi)發(fā)HarmonyOS應(yīng)用

    NEXT還將聲明式開(kāi)發(fā)延展到了動(dòng)效開(kāi)發(fā)領(lǐng)域,由數(shù)據(jù)驅(qū)動(dòng)動(dòng)畫(huà)設(shè)計(jì),帶來(lái)物理世界與UI動(dòng)效的橋梁。 最后,HarmonyOS的運(yùn)行引擎助力應(yīng)用實(shí)現(xiàn)更高性能。本次ArkTS帶來(lái)了更好的生產(chǎn)力與性能,通過(guò)支持
    發(fā)表于 08-14 15:08

    HarmonyOS NEXT新能力,一站式高效開(kāi)發(fā)HarmonyOS應(yīng)用

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

    HarmonyOS NEXT新能力,一站式高效開(kāi)發(fā)HarmonyOS應(yīng)用

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

    淘寶與華為合作將基于HarmonyOS NEXT啟動(dòng)鴻蒙原生應(yīng)用開(kāi)發(fā)

    1月25日,淘寶與華為舉辦鴻蒙合作簽約儀式,宣布將基于HarmonyOS NEXT啟動(dòng)鴻蒙原生應(yīng)用開(kāi)發(fā)。
    的頭像 發(fā)表于 01-26 16:14 ?1984次閱讀

    HarmonyOS NEXT上手體驗(yàn):無(wú)法使用原生安卓應(yīng)用

    該博主強(qiáng)調(diào),HarmonyOS NEXT 對(duì)原生的安卓應(yīng)用不再兼容,原因是本地?cái)?shù)據(jù)過(guò)多可能導(dǎo)致用戶體驗(yàn)不佳?!袄缥⑿帕奶煊涗?、筆記軟件等需要盡快找到解決方案,以確保用戶盡可能少地受到影響。”
    的頭像 發(fā)表于 04-15 14:22 ?3564次閱讀

    HDC 2024上,HarmonyOS NEXT有哪些精彩亮點(diǎn)值得期待?

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

    華為HarmonyOS NEXT 10月8日開(kāi)啟公測(cè)

    華為宣布,萬(wàn)眾矚目的HarmonyOS NEXT操作系統(tǒng)將于10月8日正式開(kāi)啟公測(cè),標(biāo)志著這一創(chuàng)新力作即將與廣大用戶見(jiàn)面。HarmonyOS NEXT作為華為自研操作系統(tǒng)的最新成果,不
    的頭像 發(fā)表于 09-24 15:41 ?1901次閱讀
    華為<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b> 10月8日開(kāi)啟公測(cè)

    華為大氣??!HarmonyOS NEXT公測(cè)發(fā)福利~這個(gè)可以有

    HarmonyOS NEXT火熱公測(cè)中,首批100萬(wàn)名公測(cè)用戶速來(lái)領(lǐng)取多重權(quán)益!這波福利不錯(cuò)
    的頭像 發(fā)表于 11-06 10:26 ?913次閱讀
    華為大氣??!<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>公測(cè)發(fā)福利~這個(gè)可以有

    第三屆大會(huì)回顧第6期 | HarmonyOS NEXT原生智能,助力應(yīng)用低成本生而智能

    原生智能是HarmonyOS NEXT的核心能力之一,通過(guò)將人工智能(AI)技術(shù)與操作系統(tǒng)深度融合,實(shí)現(xiàn)了從底層到應(yīng)用層的全面智能化。HarmonyOS
    的頭像 發(fā)表于 07-14 18:04 ?1143次閱讀
    第三屆大會(huì)回顧第6期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>原生智能,助力應(yīng)用低成本生而智能