手把手教你使用 ArkTS 中的 canvas 实现签名板功能

鸿蒙Harmony应用开发—ArkTS声明式开发(画布组件:Canvas) ArkTS声明式开发(画布组件:Canvas) 阅读详情

一、屏幕旋转

● 实现签名板的第一个功能就是旋转屏幕。旋转屏幕在各种框架中都有不一样的方式,比如:在 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 类型,这样就可以获取且不报错了。

这次的画布签名板的功能就分享这些,希望能够帮助各位开发者,后续会继续分享出更多在项目中经常用到的工具。

鸿蒙Harmony应用开发—ArkTS声明式开发(画布组件:CanvasRenderingContext2D) ArkTS声明式开发(画布组件:CanvasRenderingContext2D) 阅读详情

相关推荐

鸿蒙5.0版开发:ArkTS画布组件(Canvas)

提供画布组件,用于自定义绘制图形。

m0_69424697的博客 1331

HarmonyOS/OpenHarmony应用开发-ArkTS画布组件CanvasRenderingContext2D对象(十四)

HarmonyOS/OpenHarmony应用开发-ArkTS画布组件CanvasRenderingContext2D对象(十四)createPattern bezierCurveTo

weixin_69135651的博客 340

如何使用ArkTS中的canvas实现签名板功能

实现签名板的第一个功能就是旋转屏幕。旋转屏幕在各种框架中都有不一样的方式,比如: 在H5端,我们一般是使用CSS中的transform属性中的rotate()方法来强制将网页横屏,然后实现一系列功能 在嵌套第三方APP中,我们一般是调用对应的SDK提供的方法,即可实现旋转屏幕 .....

2401_82546228的博客 1250

HarmonyOS ArkTS语言,运行Hello World(二)

HarmonyOS ArkTS语言,运行Hello World(二)

陈志宝‑天津|Android&Java 全栈开发工程师 916

鸿蒙ArkTS开始实例:【canvas实现签名板功能】

使用ArkTS中的canvas实现签名板的功能,canvas画布大家都很熟悉,我们会用它经常实现一些画板或者图表、表格之类的功能。canvas签名板是我在开发APP过程中实现的一个功能,开发过程中也是遇到比较多的问题。实现签名板的第一个功能就是旋转屏幕。实现方式还有很多,各有千秋,相信HarmonyOS也会提供对应API方法来设置旋转屏幕。而我自己则是在页面内通过 Window 对象的 setPreferredOrientation() 方法实现横竖屏切换。

m0_62167422的博客 1264

从仿真到流片:手把手教你优化65nm CMOS电荷泵的电流匹配与稳定性

本文详细介绍了在65nm CMOS工艺下优化电荷泵电流匹配与稳定性的工程实践指南。通过蒙特卡洛仿真、运放反馈结构版图技巧和全差分结构设计,实现优于1%的电流匹配精度和±2%以内的电流稳定性,特别针对current mismatch问题提供了有效的解决方案。

weixin_42522320的博客 417

【开发者说】手把手教你使用ArkTS中的canvas实现签名板功能

🧑‍🎓​​这次我要分享的是使用ArkTS中的canvas实现签名板的功能,canvas画布大家都很熟悉,我们会用它经常实现一些画板或者图表、表格之类的功能。canvas签名板是我在开发APP过程中实现的一个功能,开发过程中也是遇到比较多的问题。实现签名板的第一个功能就是旋转屏幕。旋转屏幕在各种框架中都有不一样的方式,比如:在H5端,我们一般是使用CSS中的transform属性中的rotate()方法来强制将网页横屏,然后实现一系列功能。

爱蹦跶的全栈大A阿 410

从打印攻击到视频重放:手把手用OULU-NPU训练你的第一个活体检测模型

本文详细介绍了如何使用OULU-NPU数据集训练活体检测模型,以应对打印攻击和视频重放等安全威胁。通过PyTorch框架,从环境准备、数据加载、预处理到模型架构设计,手把手教你构建一个高效的双流网络,结合CNN和LSTM技术,提升模型在多种攻击场景下的检测准确率。

weixin_29092031的博客 385

HamronyOS开发5.0【实现签名板的功能】

目前鸿蒙已经推出API12了,对比API9的时候,现在实现一个功能太简单了。这期主要讲一下之前实现功能有多难受,以及如何实现。,现在这套代码也是可以直接迁移到API12版本的。

2401_82772199的博客 970

联想拯救者r7000p在ubuntu20.04未找到wifi适配器,安装rtl8852ae网卡驱动问题解决方案

新买的拯救者r7000p 2021款,装完ubuntu20.04之后显示未找到wifi适配器, 更换N次源之后还是只有一个显卡驱动,在网上找了很多方法,再自己折腾了一段时间后,总算是解决了这个问题。 1.设置bios 打开主板系统,将security boot设置为disenable,因为设计到修改内核配置,必须得关掉安全启动。 2.查询网卡状态 使用命令查询网卡(hardware of Internet)状态 lshw -C network 因为是双系统,在Windows下控制面板-设备管理器中可以

MCZ777的博客 1万+

Inception-Resnet-v1、Inception-Resnet-v2学习笔记(附Pytorch代码)_inception-resnet-v1 代码

Reduction-B模块:输入8*8*1792,输出8*8*1792.IR-B模块*10:输入17*17*896,输出17*17*896.IR-A模块*5:输入35*35*256,输出35*35*256.IR-A模块*5:输入35*35*384,输出35*35*256.IR-B模块*10:输入17*17*896,输出8*8*1792.IR-C模块*5:输入8*8*1792,输出8*8*1792.IR-C模块*5:输入8*8*1792,输出8*8*1792.

2401_89285791的博客 470

鸿蒙ArkTS Canvas实战:转盘抽奖程序开发教程(基础到进阶)

本期代码仓库: Gitte-随着鸿蒙生态的蓬勃发展,HarmonyOS应用开发已成为众多开发者关注的新热点。ArkTS作为鸿蒙生态主推的应用开发语言,其声明式UI和高性能特性为构建复杂动效的界面提供了强大支持。在众多UI组件中,组件犹如一块画布,赋予开发者直接绘制图形的能力,是实现自定义、高灵活性UI动效的利器。为了帮助大家将ArkTS和Canvas的理论知识转化为实战能力,我将带领你从零开始,一步步实现一个功能完备的“转盘抽奖”程序。这不仅仅是一个简单的绘图练习,更是一个综合性的练手项目。

小韩的博客 6245

(UE4 4.27) HISM性能优化:从空间剔除到合批渲染的实战解析

本文深入解析了UE4 4.27中HISM(UHierarchicalInstancedStaticMesh)组件的性能优化原理与实战技巧。核心在于利用其N叉树空间结构实现高效的CPU视锥剔除,并结合GPU实例化进行合批渲染。文章详细探讨了从控制叶子节点粒度、平衡剔除精度与渲染效率,到结合LOD系统等关键参数的调优方法,为开放世界或大场景的植被性能瓶颈提供了系统解决方案。

weixin_29015051的博客 328

HarmonyOS7 Canvas 签名板:用 PanGesture 采集轨迹点 + Canvas 渲染

电子签名、手写备注、涂鸦画板——这些功能看似需要专业的绘图库,其实 ArkUI 的Canvas组件配合PanGesture就能搞定。核心思路是:用手势采集手指的轨迹点,用 Canvas 把点连成线。今天来拆解一个签名板的实现思路。签名板的核心就是"采集 + 渲染"两步。PanGesture负责采集手指轨迹,Canvas负责把轨迹画出来。把这两个 API 用好,不仅能做签名板,还能做涂鸦画板、手写识别输入等功能。实际项目中别忘了处理多笔画和图片导出的需求。

71

gcc/g++ 链接库的编译与链接

gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.youkuaiyun.com/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可

Surge 4万+

使用 Simulink 进行电力电子系统的效率优化仿真

电力电子系统(Power Electronics System)是现代电力系统和工业自动化中的关键组成部分,广泛应用于可再生能源发电、电动汽车、不间断电源(UPS)、电机驱动等领域。为了提高系统的整体性能和经济性,必须对电力电子系统的效率进行优化。效率优化的目标是最大化系统的能量转换效率,减少损耗,从而提高系统的可靠性和经济效益。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的效率优化策略。本教程将详细介绍如何使用 Simulink 进行电力电子系统的效率优化仿真。

xiaoheshang_123的博客 356

《星际练字板》一、Canvas使用指南

在 HarmonyOS 应用开发中,Canvas(画布)是最核心的 2D 绘图组件。无论是儿童练字板、签名板、涂鸦应用,还是数据可视化图表,都离不开 Canvas 的身影。本文将系统讲解 Canvas 组件的使用方法,并通过一个完整的实战示例,带你从零基础到熟练运用 Canvas 进行绘图开发。Canvas 是 ArkUI 框架提供的自定义绘制组件,开发者可以通过上下文对象,在画布上绘制各种图形、文本和图像。能力说明绘制图形矩形、圆形、弧线、多边形、贝塞尔曲线等绘制文本。

army16的专栏 337

手把手教你用ESP32-S3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-S3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9919

HarmonyOS 5.0应用开发——Canvas制作个人签名

使用鸿蒙Canvas制作个人签名是一种在HarmonyOS系统环境下,利用Canvas组件实现手写签名功能的技术。

高心星的专栏 1644

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

鸿蒙系统(HarmonyOS)应用开发之实现电子签名效果

基于OpenHarmony平台开发的DevEco电子签名应用,该应用提供精准手写签名功能,支持4种颜色选择和1-10级线条粗细调节,采用Canvas绘图技术实现流畅签名体验。应用包含撤销、清除画布和即时保存等实用功能,界面简洁直观,自适应不同屏幕尺寸。技术架构使用ArkTS/ETS语言开发,通过CanvasRenderingContext2D实现高精度绘图,并采用离屏渲染技术优化性能。适用于合同签署、会议纪要、法律文件等多种场景,为移动办公提供便捷安全的电子签名解决方案。

前端开发-前端技术分享 1411

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【转盘决定吧】HarmonyOS ArkTS 实战:随机引擎、转盘 Canvas 与结果闭环

项目名称:转盘决定吧。本文围绕《【转盘决定吧】HarmonyOS ArkTS 实战:随机引擎、转盘 Canvas 与结果闭环》补充真实场景、关键代码、结构拆分、验证清单和排错记录,帮助读者按步骤复现同类 HarmonyOS/前端工程问题。 ​ ​ ​ 摘要 随机工具不是一个 Math.random() 就结束。本文从“转盘决定吧”的转盘、随机抽取、硬币、骰子四类功能出发,拆解一个随机功能的完整技术闭环:输入校验、

2401_84996024的博客 2739

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从零构建 HarmonyOS 原生应用与 2D 游戏:ArkTS + ArkUI 全栈开发实战

本文介绍如何从零开发HarmonyOS原生应用和2D游戏的全栈开发方案。首先讲解开发环境配置,包括DevEco Studio、HarmonyOS SDK和Node.js的安装。然后通过ArkTS语言和ArkUI框架,演示如何构建支持手机、平板和PC的自适应界面。重点展示了一个类似"Flappy Bird"的2D游戏实现过程,包括Canvas组件使用、游戏核心逻辑设计(重力系统、管道生成、碰撞检测)以及性能优化。文章提供了完整的代码示例,涵盖响应式布局、页面路由、游戏引擎开发等关键技术点,

2501_93573294的博客 1368

鸿蒙 HarmonyOS 应用开发实战|手势绘制(Drawing Canvas)— onTouch 事件与画笔/橡皮擦

手势绘制(Drawing Canvas)是一款手指涂鸦画板应用。用户可以在画布上通过手指滑动自由绘制线条,支持 8 种颜色选择和 3 种笔触大小切换,并提供了橡皮擦擦除和清空画布功能。在当前版本的 HarmonyOS 中,虽然没有像 Web 端 Canvas API 那样提供path或lineTo等绘图上下文,但通过onTouch事件记录触摸点坐标,再利用Stack层叠布局在不同位置渲染小圆点,同样可以实现流畅的手绘效果。这种点阵式绘图。

2403_87838053的博客 211

鸿蒙原生ArkTS-鸿蒙6.0新特性-动态模糊视频背景登录页

鸿蒙6.0 ArkTS动态模糊登录页技术解析 本项目基于鸿蒙6.0(HarmonyOS NEXT)的ArkUI框架,打造了一个具有动态模糊视频背景的沉浸式登录页面。核心特性包括: 三层视觉架构: 底层Canvas粒子动画系统(80个彩色粒子+星云光晕+连线效果) 中层渐变遮罩层 上层毛玻璃悬浮登录卡片 关键技术点: 采用backgroundBlurStyle实现毛玻璃效果 CanvasRenderingContext2D绘制动态粒子背景 @State响应式状态管理 animateTo弹性动画交互 深浅色主题

s1316339343的博客 405

#鸿蒙 NEXT 应用开发实战:用 ArkTS 打造喝水提醒 App(API 24 篇)

本文介绍了基于HarmonyOS NEXT和ArkTS开发喝水提醒App的全过程。作者针对现代人饮水不足的问题,分析了现有应用存在的平台绑定、通知干扰等问题,选择API 24版本作为开发目标,充分利用ArkTS严格模式的类型安全和性能优势。文章详细阐述了开发环境配置、核心需求分析(包括饮水记录、进度可视化、目标设置等五大功能),以及采用单页面+状态驱动的架构设计。该项目充分利用鸿蒙生态特性,打造轻量级、本地优先的喝水提醒解决方案,避免功能臃肿,专注于改善用户饮水习惯。

duluo133的博客 467

HarmonyOS 6.1.1:让 Canvas 的文字抗锯齿进入运行时

前端开发里有一类问题很难沟通:页面没有报错,功能也能使用,但用户觉得某段文字“不够清楚”。如果文字来自普通 ArkUI 组件,开发者通常会先检查字体、字号、字重和布局;如果文字画在 Canvas 中,排查范围还要加上画布尺寸、设备像素密度、坐标位置、缩放比例、重复绘制和图片压缩。这些变量叠在一起时,一张静态截图很难回答问题。设计人员看到的是边缘发虚,测试人员记录的是某台设备上效果不一致,开发人员却不知道差异究竟来自字体、屏幕还是绘制策略。传统做法往往是修改代码、重新构建、重新安装,再凭记忆比较上一次画面。

TKK1234567890的博客 537
上一篇: HamronyOS 自动化测试框架使用指南
下一篇: HarmonyOS 应用事件打点开发指导
「已注销」
博客等级 码龄5年 1045粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值