当前位置: 首页 > 科技观察

OpenHarmony-基于ArkUI的花样解锁组件(JS)(一)

时间:2023-03-12 05:35:03 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com前言Openharmony是我们国产的开源系统,js/ets是最发达的语言,完全抛弃了java。作为前端开发者,我们也需要把自己的国产系统做大,所以可以贡献一点力量。项目介绍ohos-pattern是一个功能解锁组件,基于openharmonyAkrUI(JS)实现。在手机指纹解锁出现之前,图案解锁是非常流行的功能,包括数字解锁。但是,仍然有很多应用场景使用了图案解锁和数字解锁的功能。本文中的花样解锁只是UI层面的实现,不涉及加解密的方式。这可以用于二次开发。本文为第一篇,后续会添加数字解锁功能。如果后续涉及到生物识别API,会增加指纹解锁等三种解锁方式。环境说明开发工具:DevEcoStudio3.0Beta4SDK版本:3.1.6.6(APIVersion8)主要组件:画布效果显示组件属性属性名称类型默认值函数radiusNumber5密码点半径[5-20]scopeNumber20热区范围[20-40]point-colorString#383838密码点颜色point-stroke-colorString#ff9800密码点边框颜色active-colorString#ff9800活动密码点颜色line-colorString#1a73e8密码线条颜色active-line-colorString#04be02活动密码线条颜色是-show-lineBooleantrue是否显示密码行组件事件属性名称类型返回值备注result-cbFunctionArray返回密码结果参考组件

实现思路实现思路比较简单,使用canvas绘制九个密码点,然后通过监听九个密码点的手势触摸和碰撞生成密码数据,创建canvas。绘制9个代码点。绘制可控区域(即密码点跟随手指的移动区域)。听手势。实现过程1.创建画布创建画布元素,并绑定touchstart、touchmove、touchend手势事件。
在js中初始化canvas对象。onShow(){this.initCanvas();},//初始化画布initCanvas(){constc=this.$refs.canvas;this.ctx=c.getContext('2d',{antialias:true});},2.画出九个密码点我们看下面的草图:从草图中,我们可以看到我们密码点的位置。这里我们使用for循环的方式来实现,创建3条线,每条线有3个点。这里有一个需要注意的地方,因为我们的密码点有一个需要用手势移动,需要修改point_list的数据,所以我们使用point_list_copy复制一份,这里使用es6..的扩展运算符.实现深拷贝。//创建9个密码点createPoint(){letpoint_x=Math.ceil((this.w-this.R*6)/4+this.R);让point_y=Math.ceil((this.h-this.R*6)/4+this.R);for(varj=0;j<3;j++){for(vari=0;i<3;i++){让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];这个.drawPoint(d);}}},以下实现在画布上指向9个密码。//在画布上绘制9个密码点drawPoint(obj){let{x,y}=obj;//绘制外圈this.ctx.beginPath();this.ctx.lineCap="圆形";//将圆形线帽添加到线的每一端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";这个.ctx.fill();this.ctx.closePath();},看一下绘制后的效果:3.监听手势和密码点的碰撞。我们在TouchStart上写了三个手势事件。TouchMove上的触摸变化。触摸结束onTouchEnd。onTouchStart(e){让x=e.touches[0].localX;让y=e.touches[0].localY;this.isCollision(x,y)},onTouchMove(e){让x=e.touches[0].localX;让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('patternresult:',this.result)this.result=[];},重绘画布://重绘reDraw(x,y,bol){for(letiinthis.point_list){//重绘9个代码点this.drawPoint(this.point_list[i]);}for(letiinthis.result){//重绘密码状态this.drawStatus(this.result[i]);}},监听手势触摸是否与密码点碰撞。this.scope表示热区的范围。当触摸点进入热区范围时,即表示触摸点与密码点发生了碰撞。//是否与9个密码点联系。isCollision(x,y){让c_x,c_y;for(letiinthis.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