OpenHarmony - 基于 ArkUI(JS)实现图案解锁组件(一)
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效果展示
组件属性
属性名
类型
默认值
作用
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、绘制九个密码点
下面看个草图:
从草图上可以看出我们的密码点位置了,这里使用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();},下面来看看绘制后的效果:
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)}},下面看看效果:
但是这样还不够,我们能还需要绘制连接的密码线。
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();}},好了,下面我们看看加上密码线的效果:
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];}},最后来看看加上热区的效果:
到这里,整个基本功能已经实现了。
最后再来看一下最终效果:
代码地址
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位免费下载
语言:中文版系统大小:5.13GB系统类型:Win11微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化 1、保留 Edge浏览器。 2、隐藏“操作中心”托盘图标。 3、保留常用组件(微软商店,计算器,图片查看器等)。 5、关闭天气资讯。
Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载
语言:中文版系统大小:4.75GB系统类型:Win11Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风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位) 高速下载
语言:中文版系统大小:3.91GB系统类型:Win7欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统
相关文章
- 教大家戴尔笔记本怎么重装系统
- Win7更改适配器设置一片空白怎么办?
- 千牛与阿里旺旺卖家版哪个好?技巧比较_其它聊天
- reboot and select proper boot device怎么修复
- win7系统总是弹出realtek高清晰音频管理器如何解决
- 电脑连接不上无线网络,本文教您处理笔记本电脑连不上无线网络
- 判断U盘是否中毒的办法
- 笔记本w7系统,本文教您笔记本win7系统
- 移动硬盘分区,教您移动硬盘分区办法
- Win7 32位旗舰版系统下防火墙无法启动提示错误0x6D9怎么办?
- WinXP如何再取得微软5年安全更新支持
- 联想台式机重装系统(安装系统)图文详细教程图解
- win10压缩文件损坏怎样修好
- win10登录QQ提示“个人文件夹所在磁盘已满”的处理办法
- Win11隐藏功能有哪些?Win11隐藏功能一览
- Win8双显卡开机出现黑屏的处理办法
- 如何使用Audition软件消除人声?
- Win10如何清理已使用背景图片痕迹?
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 4雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
常用系统
- 1Win10 21H1 19043.1466 官方正式版下载_Win10 21H1 KB5009543 64位官方镜像下载
- 2番茄花园 GHOST WIN7 SP1 X64 官方修正版 V2023.01 (64位) 下载
- 3雨林木风Ghost Win10 电脑城专业版x86 v2023.01免费最新下载
- 4番茄花园 GHOST WIN7 SP1 X86 完美装机版 V2018.07 (32位) 下载
- 5电脑公司win10 64位无卡顿版 v2023.03系统免费下载
- 6windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
- 7新萝卜家园Ghost Win8.1 X64位 纯净版2021年4月(自动激活) ISO镜像高费下载
- 8新萝卜家园 Ghost XP SP3系统 电脑城极速纯净版 2020年9月 ISO镜像高速下载
- 9Win10 22H2专业版下载_Win10 22H2 64位免激活专业版下载
- 10GHOST WIN8 X64 装机专业版 V2023.02 (64位) 下载