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

    文章

    1238

    浏览量

    68482
  • 屏幕
    +关注

    关注

    6

    文章

    1161

    浏览量

    55353
  • 开发者
    +关注

    关注

    1

    文章

    499

    浏览量

    16397
  • HarmonyOS
    +关注

    关注

    79

    文章

    1859

    浏览量

    29267

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

文章出处:【微信号:HarmonyOS_Dev,微信公众号:HarmonyOS开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    使用ArkTS中的canvas实现签名板的功能canvas画布大家都很熟悉,我们会用它经常
    的头像 发表于 04-08 10:10 403次阅读
    鸿蒙<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

    如何利用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 2660次阅读

    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 1873次阅读

    鸿蒙开发之ArkTS基础知识

    一、ArkTS简介 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,匹配了鸿蒙的ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开
    的头像 发表于 01-24 16:44 619次阅读
    鸿蒙开发之<b class='flag-5'>ArkTS</b>基础知识