GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>系统教程 > OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)

来源:Ghost系统之家浏览:时间:2023-04-12 11:37:52

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)

作者:杨尚晓 2022-09-15 15:04:16系统 OpenHarmony Ohos-pattern是一个解锁功能的组件,是基于Openharmony AkrUI(JS)实现的。在手机指纹解锁还没来临之前,图案解锁是一个很热门的功能,包括数字解锁。不过现在也还很多应用场景中有使用到图案解锁和数字解锁的功能。

​​想了解更多关于开源的内容,请访问:​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​

前言

Openharmony作为我们国内开源系统,并且以js/ets最为开发语言,完全抛弃了java。作为一名前端开发人员,也需要为咱们国产系统壮大起来,所以贡献一份微薄之力。

项目介绍

ohos-pattern是一个解锁功能的组件,是基于openharmony AkrUI(JS)实现的。在手机指纹解锁还没来临之前,图案解锁是一个很热门的功能,包括数字解锁。不过现在也还很多应用场景中有使用到图案解锁和数字解锁的功能。本文图案解锁仅仅只是实现UI层面,并不涉及到加密解密的的方式。这个可以二次开发使用。

本文为第一篇,后续会更新加入数字解锁功能,如果后续能涉及到生物识别API,还会加入指纹解锁等三种解锁方式。

环境说明

开发工具:DevEco Studio 3.0 Beta4SDK版本:3.1.6.6(API Version 8)主要组件:canvas

效果展示

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

组件属性

属性名

类型

默认值

作用

radius

Number

5

密码点半径[5-20]

scope

Number

20

热区范围[20-40]

point-color

String

#383838

密码点内颜色

point-stroke-color

String

#ff9800

密码点边框颜色

active-color

String

#ff9800

激活密码点颜色

line-color

String

#1a73e8

密码线颜色

active-line-color

String

#04be02

激活密码线颜色

is-show-line

Boolean

true

是否显示密码线

组件事件

属性名

类型

返回值

备注

result-cb

Function

Array

返回密码结果

引用组件

实现思路

实现思路比较简单,使用canvas绘制九个密码点,然后通过监听手势触摸和9个密码点的碰撞产生密码数据

创建canvas。绘制9个密码点。绘制可控区域(就是密码点跟随手指一动区域)。监听手势。

实现过程

1、创建canvas

创建canvas元素,并且绑定touchstart,touchmove,touchend手势事件。

在js中初始化canvas对象。

onShow(){this.initCanvas();},// 初始化画布initCanvas(){const c = this.$refs.canvas;this.ctx = c.getContext('2d', { antialias: true });},

2、绘制九个密码点

下面看个草图:

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

从草图上可以看出我们的密码点位置了,这里使用for循环方法实现,创建3行,每行3个点。

这里有个注意点,因为我们密码点有一个需要跟随手势移动的需求,需要修改point_list的数据,所以使用point_list_copy复制了一份出来,这里使用es6的展开运算符…来实现深拷贝。

// 创建9个密码点createPoint(){let point_x = Math.ceil((this.w - this.R * 6) / 4 + this.R);let point_y = Math.ceil((this.h - this.R * 6) / 4 + this.R);for (var j = 0; j < 3; j++) {for (var i = 0; i < 3; i++) {let d = {x: point_x * (i + 1) + this.R * i,y: point_y * (j + 1) + this.R * j}this.point_list.push(d);this.point_list_copy = [...this.point_list];this.drawPoint(d);}}},

下面实现将9个密码点到画布上。

// 绘制9个密码点到画布上drawPoint(obj) {let {x, y} = obj;// 绘制外圆环this.ctx.beginPath();this.ctx.lineCap = "round"; //向线条的每个末端添加圆形线帽this.ctx.lineWidth = (this.R / 2);//绘制圆的边框this.ctx.strokeStyle = '#ff9800'; //绘制边框的颜色this.ctx.arc(x, y, this.R, 0, 2 * Math.PI);this.ctx.stroke();this.ctx.closePath();// 绘制内圆this.ctx.beginPath();this.ctx.arc(x, y, this.R, 0, 2 * Math.PI);this.ctx.fillStyle = "#383838";this.ctx.fill();this.ctx.closePath();},

下面来看看绘制后的效果:

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

3、监听手势和密码点的碰撞

我们写了三个手势事件

触摸开始 onTouchStart。触摸变化 onTouchMove。触摸结束 onTouchEnd。onTouchStart(e){let x = e.touches[0].localX;let y = e.touches[0].localY;this.isCollision(x, y)},onTouchMove(e){let x = e.touches[0].localX;let y = e.touches[0].localY;this.isCollision(x, y);// 每次触摸后都需要清除画布重新绘制this.ctx.clearRect(0, 0, this.w, this.h);this.reDraw(x, y, true);},onTouchEnd(e){this.ctx.clearRect(0, 0, this.w, this.h);this.reDraw(e.touches[0].clientX, e.touches[0].clientY, false);// 松开手后,记录所有触摸的点lg.log('图案结果:',this.result)this.result = [];},

重绘画布:

// 重绘reDraw(x, y, bol) {for (let i in this.point_list) {// 重新绘制9个密码点this.drawPoint(this.point_list[i]);}for (let i in this.result) {// 重新绘制密码状态this.drawStatus(this.result[i]);}},

监听手势触摸是否和密码点发生碰撞。

this.scope表示热区范围,当触摸点进入这个热区范围,说明已经跟该密码点发生接触碰撞了。

// 是否跟9个密码点发生接触。isCollision(x, y) {let c_x, c_y;for (let i in this.point_list) {c_x = Math.abs(x - this.point_list[i].x);c_y = Math.abs(y - this.point_list[i].y);// 如果发生碰撞,记录状态if (c_x < this.scope && c_y < this.scope) {lg.warn('发生了碰撞,碰撞点是:', i)this.drawStatus(i)return}}},

当触摸点和密码点发生碰撞之后,需要给该密码点绘制触摸状态

//绘制触摸到密码点的状态drawStatus(index) {// 绘制状态内圆this.ctx.beginPath();this.ctx.arc(this.point_list[index].x, this.point_list[index].y, (this.R / 2), 0, 2 * Math.PI);this.ctx.fillStyle = "#ac2dfb";this.ctx.fill();this.ctx.closePath();//记录缓存碰撞的结果if(this.result.indexOf(index) === -1){this.result.push(index)}},

下面看看效果:

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

但是这样还不够,我们能还需要绘制连接的密码线。

4、绘制密码线

在重绘方法里最顶端加入绘制密码线方法。

this.drawLine(this.result, x, y, bol);

绘制密码线方法。

这里需要绘制两条线:

一条是跟随触摸移动的线。一条是已经存在两点之间的线。drawLine(arr, x, y, bol) {if(arr.length === 0){return;}// 当存在已经两个点的时候,两点直线形成连线this.ctx.beginPath();for (let i in arr) {if (i == 0) {this.ctx.moveTo(this.point_list[arr[i]].x, this.point_list[arr[i]].y);} else {this.ctx.lineTo(this.point_list[arr[i]].x, this.point_list[arr[i]].y);}}this.ctx.strokeStyle = '#1a73e8';this.ctx.lineWidth = (this.R / 2);this.ctx.stroke();// 跟着手机滑动的线条if (bol) {this.ctx.beginPath();this.ctx.moveTo(this.point_list[arr[arr.length - 1]].x, this.point_list[arr[arr.length - 1]].y);this.ctx.lineTo(x, y);this.ctx.strokeStyle = '#04be02';this.ctx.lineWidth = (this.R / 2);this.ctx.stroke();}},

好了,下面我们看看加上密码线的效果:

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

5、实现可移动的密码点

优化体验,增加了密码点跟随手势一起移动的效果。

在重绘的顶部添加绘制可移动的密码点方法。

// 绘制跟随手势移动的密码点this.pointAn(x,y,bol);

r_x,r_y表示密码点热区范围,在热区范围内可以将该密码点变为触摸点跟随触摸点一起移动,当触摸点离开了热区之后,密码点回到原来的中心位置。

// 绘制状态point范围内活动pointAn(x, y, bol){if(bol){if(this.result.length === 0){return;}let t = this.result[this.result.length - 1];let r_x = Math.abs(x - this.point_list_copy[t].x);let r_y = Math.abs(y - this.point_list_copy[t].y);if(r_x < this.scope && r_y < this.scope){this.point_list[t] = {x,y}} else {this.point_list = [...this.point_list_copy];}} else {this.point_list = [...this.point_list_copy];}},

最后来看看加上热区的效果:

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

到这里,整个基本功能已经实现了。

最后再来看一下最终效果:

OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)-开源基础软件社区

代码地址

​​ohos-pattern 基于OpenHarmony JSAPI实现图案解锁组件​​。

总结

该组件整体实现逻辑都比较简单,主要是通过手势去绘制canvas画布实现的,这里需要注意的是,api version需要7以上,因为在api version 6 之前,存在canvas重绘闪屏的情况,在api 7之后修复了这个问题。相比api 6之前的版本,api8真的优化和修复了很多功能。很期待harmongOS 3.0更新,可以在真机下去体验ets开发的应用。

​​想了解更多关于开源的内容,请访问:​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​。

责任编辑:jianghua 来源:​​51CTO开源基础软件社区 ArkUI鸿蒙

推荐系统

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户

  • 番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    语言:中文版系统大小:3.91GB系统类型:Win7

    欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统