首页 > 其他分享 >手把手教你使用ArkTS中的canvas实现签名板功能

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

时间:2023-12-20 10:47:22浏览次数:27  
标签:ArkTS 手把手 100% canvas private window context 屏幕 event

 

一、屏幕旋转

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

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

标签:ArkTS,手把手,100%,canvas,private,window,context,屏幕,event
From: https://www.cnblogs.com/HarmonyOSDev/p/17915943.html

相关文章

  • HarmonyOS学习(二) ArkTS 基础知识
    HarmonyOS学习(二)ArkTS基础知识一、ArkTS介绍ArkTS是HarmonyOS应用的开发语言,在TypeScript的基础上拓展了声明式UI、状态管理等相应的能力,让开发者以更简洁自然的方式开发高性能应用。TypeScript是JavaScript的拓展,ArkTS是TypeScript的拓展。 二、声明式UI规范下图为ArkT......
  • 开发案例:使用canvas实现图表系列之折线图
     一、功能结构实现一个公共组件的时候,首先分析一下大概的实现结构以及开发思路,方便我们少走弯路,也可以使组件更加容易拓展,维护性更强。然后我会把功能逐个拆开来讲,这样大家才能学习到更详细的内容。下面简单阐述下折线图组件的功能结构:以上是基础的功能结构框架,包含一些比......
  • js(canvas) 图片压缩
    1functioncompress(url,width,height){2returnnewPromise((resolve,reject)=>{3letimg=document.createElement('img')4img.onload=()=>{5letw=width6leth=img.naturalH......
  • uniapp 微信小程序使用canvas
    微信小程序基础库大于2.9.0后,canvas(画布)支持一套新Canvas2D接口(需指定type属性),同时支持同层渲染,原有接口不再维护。在这种情况下使用原有接口会报错,报错例如:1、使用ctx.draw()会报错:drawisnotafunction,原因:新版Canvas2D接口没有draw方法2、使用ctx.setfillStyle......
  • 用html+css+js做canvas烟花模拟网页动画代码
    圣诞节、元旦就要到了,本案例我们将用html+css+js做canvas烟花模拟网页动画代码,程序员的浪漫这不就来了嘛,与家人朋友一起看烟花吧!   附源码<!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"/> <title>烟花模拟器</title> <metaname="viewport"......
  • 手把手教你搭建 Ceph+JuiceFS
    Ceph提供了对象存储,可作为存储引擎在JuiceFS中使用。这一组合非常适合云计算、大数据分析和机器学习等数据密集型应用场景。在日常部署中可直接通过CephRADOS配合JuiceFS使用,无需部署RGW。基于此方案实践以及运维中的常见问题,结合Ceph官方文档整理了这篇博客,旨在帮助那......
  • 『江鸟中原』深入探索鸿蒙ArkTS:高效安全的跨语言开发体验
    随着鸿蒙操作系统的快速发展,跨语言开发成为了开发者们关注的焦点之一。鸿蒙ArkTS作为鸿蒙操作系统的重要组成部分,为开发者提供了一种高效、安全的跨语言开发体验。本文将深入探索鸿蒙ArkTS的语法,并通过实例代码演示其强大的功能和灵活性。ArkTS简介鸿蒙ArkTS是一种基于TypeScript......
  • 海外抖音tiktok运营详细教程,手把手教你轻松玩转tiktok
    在当今这个数码时代,社交媒体平台已经成为了企业、个人、组织等各类用户进行宣传、推广、营销、社交等活动的重要渠道。其中,海外抖音tiktok是一个备受关注的平台,它在全球范围内拥有超过10亿的用户,其中不少用户是年轻人,因此对于那些想要拓展年轻用户市场的企业来说,tiktok的重要性不言......
  • 手把手教你如何下载小鹅通上已购买的视频课程
    前言:很多同学都想知道小鹅通中视频课程怎么下载,但是小鹅通上面已购买的视频课程是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载小鹅通上面已购买的视频课程。一、电脑网页打开小鹅通官网(https://study.xiaoe-tech.com),找到已购买的课程二、找到想要下载的课程,点......
  • 从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能
    ScreenCap---Version:001说明从0到1,手把手带你开发windows端的截屏软件ScreenCap当前版本:ScreenCap---001支持全屏截图支持鼠标拖动截图区域支持拖拽截图支持保存全屏截图支持另存截图到其他位置警告注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮......