手把手教你使用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类型,这样就可以获取且不报错了。
这次的画布签名板的功能就分享这些,希望能够帮助各位开发者,后续会继续分享出更多在项目中经常用到的工具。
手把手教你使用ArkTS中的canvas实现签名板功能的更多相关文章
- 手把手教你写Sublime中的Snippet
手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...
- 手把手教你使用 js 实现一个 Canvas 编辑器
手把手教你使用 js 实现一个 Canvas 编辑器 拖拽 缩放,等比缩放 导出 image 模版 撤销,重做 OOP,封装,继承,多态 发布库 CI/CD (gitlab/github) ... h ...
- 手把手教你在VirtualBox中与主机共享文件夹
安装VirtualBox为了共享文件夹,折腾了一晚上!网上的很多资料都不是很全面,这里就全面的总结一下,如果有其他的疑问,可以留言多多交流. VirtualBox下载地址,版本为5.1.2 设置共享文 ...
- 小姐姐手把手教你JS数组中的对象去重
有时候数据库中的数据重复的,我们另一个需求需要数据的唯一性 那么这时候就用到这个方法了 我还是以截图的方式发粗来 不然太丑了 见谅 console.log(map)打印出来的结果已经帮我们把需要的 ...
- 手把手教你在Mac中搭建iOS的 React Native环境
准备工作 1.你需要一台Mac电脑..(这不是废话?我所用的是Air~~穷..) 2.我所操作的电脑系统环境是 3.xcode版本:8.0正式版 必需的软件 1.Homebrew Homebrew, ...
- 手把手教你在Eclipse中使用CVS Branch功能
Brach 的作用: 开发新版本的人员就基于 main trunk 工作,而 fix bug 的人员就基于 branch 工作. 一旦在 branch上将 Release_1_0的 bug修复了,我们 ...
- 手把手教你打造一款轻量级canvas渲染引擎
背景 当我们开发一个canvas应用的时候,出于效率的考量,免不了要选择一个渲染引擎(比如PixiJS)或者更强大一点的游戏引擎(比如Cocos Creator.Layabox). 渲染引擎通常会有S ...
- 手把手教你进行Scrapy中item类的实例化操作
接下来我们将在爬虫主体文件中对Item的值进行填充. 1.首先在爬虫主体文件中将Item模块导入进来,如下图所示. 2.第一步的意思是说将items.py中的ArticleItem类导入到爬虫主体文件 ...
- 手把手教你在netty中使用TCP协议请求DNS服务器
目录 简介 DNS传输协议简介 DNS的IP地址 Do53/TCP在netty中的使用 搭建DNS netty client 发送DNS查询消息 DNS查询的消息处理 总结 简介 DNS的全称doma ...
- 手把手教你在.NET中创建Web服务
最近发现在.NET平台下使用Web服务还是很简单的.下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码如 ...
随机推荐
- 百亿节点、毫秒级延迟,携程金融基于 NebulaGraph 的大规模图应用实践
作者:霖雾,携程数据开发工程师,关注图数据库等领域. 0. 背景 2017 年 9 月携程金融成立,在金融和风控业务中,有多种场景需要对图关系网络进行分析和实时查询,传统关系型数据库难以保证此类场景下 ...
- [杂项] 抢单可能需要的API
淘宝时间戳 http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp 京东库存查询 http://c0.3.cn/stock? ...
- 我和我的DBA之路
这几天,突然想写写这些年的工作总结,毕业至今快20年的回顾. 想到20年前,在做毕业设计的时候,当时是学的机械工程类专业,因为带毕业设计的老师兼职企业有个门户网站的需求,而我又会做点网站设计,带的老师 ...
- web项目开发写接口时,为什么需要在关键位置打印日志-2022新项目
一.业务场景 最近在开发新功能,新功能主要就是写app的首页查询接口,接口比较多有十几个,首页会有各种查询,新增操作比较少.由于用户量 比较大,据说并发量不小,所以首页的很多查询都做了缓存处理,用来提 ...
- 踩坑经历-jenkins安装使用
最近在整理之前临时记的笔记,好久之前了,大概记录下. 按照教程安装jenkins,随机选了个不是最新版的docker版本,然后一路下一步,但是到安装推荐插件就没有全部安装成功,我接着走下去想进到&qu ...
- Android 开发Day7
<project version="4"> <component name="ExternalStorageConfigurationManager&q ...
- JS(数组)
一 数组的概念 问:之前学习的数据类型,只能存储一个值.如果我们想存储班级中所有学生的姓名,那么该如何存储呢?答:可以使用数组(Array).数组可以把一组相关的数据一起存放,并提供方便的访问(获取) ...
- FreeRTOS教程9 软件定时器
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...
- Java22重磅发布!!!!卷不动了,真的卷不动了。。。。
就在3月19日,Java22重磅发布.Java22新增了12项增强功能,其中包括七个预览特性和一个孵化器特性,这些功能都显著到足以引起JDK增强提案(JEPs)的关注.它们涵盖了Java语言.其API ...
- MySQL与Java JDBC数据类型对照
MySQL数据类型 JAVA数据类型 JDBC TYPE BIGINT Long BIGINT TINYINT Byte TINYINT SMALLINT Short SMALLINT MEDIUMI ...