当前位置: 首页 > news >正文

网站如何设置微信支付功能哪家培训机构学校好

网站如何设置微信支付功能,哪家培训机构学校好,怎么建立自己网站,图片转二维码在线制作生成器文章目录 过程绘制形状方式详细解释定义变量布局整图Canvas需要滑动的形状 需要处理图片的方式处理抠图绘制抠出来的图 总结 群里有朋友问图片滑块验证码怎么做,就是一张图上扣出来一块,然后拖动这一小块完成拼图。 第一个想法就是偷懒一下:直…

文章目录

    • 过程
    • 绘制形状方式详细解释
      • 定义变量
      • 布局
      • 整图Canvas
      • 需要滑动的形状
    • 需要处理图片的方式
      • 处理抠图
      • 绘制抠出来的图
    • 总结

群里有朋友问图片滑块验证码怎么做,就是一张图上扣出来一块,然后拖动这一小块完成拼图。
第一个想法就是偷懒一下:直接让设计在图片上抠出来一小块,把这两个图片和抠图的坐标一块下发,用Image或者canvas自己绘制一下,监听一下手指移动,当手指抬起的时候,如果移动的坐标和抠图的坐标误差在指定范围内,就算成功。
后来说Android那边是自己处理的,下发整张图片,然后客户端自己抠图,自己处理。
Android能做的,鸿蒙应该也能做,这时候就应该掏出来Canvas怼一波了

过程

两个Canvas,一个使用drawImage画整张图片,画出来后,随机两个坐标值使用getImageData获取指定位置的图片内容。然后在这个区域绘制上边框或者填充颜色,告诉用户获取的是这个区域的内容。想上难度的话,不提示这个截取位置也行。
在另外一个Canvas上使用putImageData将图片绘制出来,绑定一下移动手势监听,然后不断更新绘制图片的坐标。当抬起手指的时候,对比一下移动的坐标和抠图的坐标,在允许的范围内,判定为成功。
结束。打完收工。完结撒花。
滑动验证

绘制形状方式详细解释

先看下面不需要处理抠图的,这个简单点,我们循序渐进。

定义变量

两个Canvas,需要两个CanvasRenderingContext2D分别绘制两个Canvas上的内容。
一个能接受的误差值。
随机出来的抠图的横纵坐标。
抠图的大小。

private settings: RenderingContextSettings = new RenderingContextSettings(true)
private canvasRendering: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
private canvasRendering2: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
//允许的误差
private diffInterval: number = 10 
//随机抠图的横坐标
private clip_start_x: number = 100
//随机抠图的纵坐标
private clip_start_y: number = 100
//抠图的宽度
private clip_image_width = 120
//抠图的高度
private clip_image_height = 120

布局

这个没啥好说的,Stack里面摞两个Canvas,底部的Canvas画整个图,上面的Canvas画形状。

整图Canvas

这里使用的本地图片,理论上讲,使用网络图片应该也能处理。
随机坐标时,注意减去抠图的宽度,否则万一随机出来的坐标在绘制完形状之后超出的图片范围就好玩了。
这里随机之后绘制了一个三角形。

     Canvas(this.canvasRendering).width("100%").height("100%").onReady(() => {//这里用的本地图片let imageBitMap: ImageBitmap = new ImageBitmap("pages/playground/cat.webp")this.canvasRendering.drawImage(imageBitMap, 0, 0)hilog.error(0x01, 'SlideVerificationView2', 'imageBitMap width --> ' + imageBitMap.width)hilog.error(0x01, 'SlideVerificationView2', 'imageBitMap height --> ' + imageBitMap.height)//随机两个坐标,注意不要超出图片范围this.clip_start_x = Math.floor(Math.random() * (imageBitMap.width - this.clip_image_width))this.clip_start_y = Math.floor(Math.random() * (imageBitMap.height - this.clip_image_height))hilog.error(0x01, 'SlideVerificationView2', 'clip_start_x --> ' + this.clip_start_x)hilog.error(0x01, 'SlideVerificationView2', 'clip_start_y --> ' + this.clip_start_y)this.canvasRendering.lineWidth = 2this.canvasRendering.strokeStyle = '#FFFFFF'//在对应的区域绘制标识,这里画了个三角形,想画其他的自己调整就好this.canvasRendering.moveTo(this.clip_start_x + this.clip_image_width / 2, this.clip_start_y)this.canvasRendering.lineTo(this.clip_start_x + this.clip_image_width, this.clip_start_y + this.clip_image_height)this.canvasRendering.lineTo(this.clip_start_x, this.clip_start_y + this.clip_image_height)this.canvasRendering.lineTo(this.clip_start_x + this.clip_image_width / 2, this.clip_start_y)this.canvasRendering.stroke()})

需要滑动的形状

我们拿到了随机的坐标后,在新的Canvas上绘制相同的形状。
这里需要监听手指的滑动,我们使用了priorityGesture来绑定PanGesture。注意这里滑动最小距离为5vp时识别成功
这里我们限制了只能横向滑动。想加点难度的话,可以在横纵方向上都能滑动。
最后在onActionEnd的时候判断一下移动的坐标是否满足条件

      Canvas(this.canvasRendering2).width("100%").height("100%").onReady(() => {})//绑定优先识别手势.priorityGesture(//平移手势,滑动最小距离为5vp时识别成功。PanGesture().onActionStart((event: GestureEvent) => {}).onActionUpdate((event: GestureEvent) => {//重置一下画布this.canvasRendering2.reset()//绘制形状,和整图canvas中的形状、大小一致this.canvasRendering2.moveTo(event.offsetX + this.clip_image_width/2, this.clip_start_y)this.canvasRendering2.lineTo(event.offsetX + this.clip_image_width, this.clip_start_y + this.clip_image_height)this.canvasRendering2.lineTo(event.offsetX, this.clip_start_y + this.clip_image_height)this.canvasRendering2.lineTo(event.offsetX + this.clip_image_width/2, this.clip_start_y)this.canvasRendering2.strokeStyle = Color.Pinkthis.canvasRendering2.lineWidth = 2this.canvasRendering2.stroke()}).onActionEnd((event: GestureEvent) => {hilog.error(0x01, 'SlideVerificationView', `onActionEnd ${event.offsetX.toString()}`)//判定是否成功if (Math.abs(event.offsetX - this.clip_start_x) < this.diffInterval) {promptAction.showToast({ message: '验证成功' })} else {promptAction.showToast({ message: '验证失败' })this.canvasRendering2.reset()}}))

这种是最简单的,不需要处理图片,只需要绘制形状就好了

需要处理图片的方式

比起上面这种,我们只需要多定义一个ImageData就好了

private settings: RenderingContextSettings = new RenderingContextSettings(true)
private canvasRendering: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
private canvasRendering2: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
private diffInterval: number = 10
private clip_start_x: number = 100
private clip_start_y: number = 100
private clip_image_width = 120
private clip_image_height = 120
private imageData?: ImageData

处理抠图

在绘制整图的Canvas上调用getImageData获取一下抠出来的图片内容就好了。
由于ImageData是个正方形,我们这里需要处理成三角形,我没有找到很好的方法,只能对ImageData.data属性进行处理,它是一维数组,保存了相应的颜色数据,数据值范围为0到255。

      Canvas(this.canvasRendering).width("100%").height("100%").onReady(() => {let imageBitMap: ImageBitmap = new ImageBitmap("pages/playground/cat.webp")this.canvasRendering.drawImage(imageBitMap, 0, 0)hilog.error(0x01, 'SlideVerificationView2', 'imageBitMap width --> ' + imageBitMap.width)hilog.error(0x01, 'SlideVerificationView2', 'imageBitMap height --> ' + imageBitMap.height)this.clip_start_x = Math.floor(Math.random() * (imageBitMap.width - this.clip_image_width))this.clip_start_y = Math.floor(Math.random() * (imageBitMap.height - this.clip_image_height))hilog.error(0x01, 'SlideVerificationView2', 'clip_start_x --> ' + this.clip_start_x)hilog.error(0x01, 'SlideVerificationView2', 'clip_start_y --> ' + this.clip_start_y)this.imageData = this.canvasRendering.getImageData(this.clip_start_x, this.clip_start_y, this.clip_image_width, this.clip_image_height)//在对应的区域绘制标识this.canvasRendering.lineWidth = 2this.canvasRendering.fillStyle = '#66FFFFFF'this.canvasRendering.moveTo(this.clip_start_x + this.clip_image_width / 2, this.clip_start_y)this.canvasRendering.lineTo(this.clip_start_x + this.clip_image_width, this.clip_start_y + this.clip_image_height)this.canvasRendering.lineTo(this.clip_start_x, this.clip_start_y + this.clip_image_height)this.canvasRendering.lineTo(this.clip_start_x + this.clip_image_width / 2, this.clip_start_y)this.canvasRendering.fill()//将ImageData处理成三角形if(this.imageData){let width = this.imageData.width * 4let height = this.imageData.heightlet rate = width / heightlet widthCenter = Math.floor(width / 2)for (let i = 0; i < height; i++) {//第几行for (let j = 0; j < width; j++) {//第几列if (j < widthCenter - rate * i / 2) {this.imageData.data[i * width +j] = 0} else if (j > widthCenter + rate * i / 2) {this.imageData.data[i * width +j] = 0}}}}})

绘制抠出来的图

这个就更简单了,相同的绑定手势方法,相同的判定方法。
唯一的变化就是在onActionUpdate回调中使用putImageData绘制图片

    Canvas(this.canvasRendering2).width("100%").height("100%").onReady(() => {}).priorityGesture(PanGesture().onActionStart((event: GestureEvent) => {}).onActionUpdate((event: GestureEvent) => {hilog.error(0x01, 'SlideVerificationView', event.offsetX.toString())if (this.imageData) {this.canvasRendering2.reset()this.canvasRendering2.putImageData(this.imageData, event.offsetX, this.clip_start_y)}}).onActionEnd((event: GestureEvent) => {hilog.error(0x01, 'SlideVerificationView', `onActionEnd ${event.offsetX.toString()}`)if (Math.abs(event.offsetX - this.clip_start_x) < this.diffInterval) {promptAction.showToast({ message: '验证成功' })} else {promptAction.showToast({ message: '验证失败' })this.canvasRendering2.reset()}}))

到此,我们就完成了简单的滑动图片验证的功能

总结

整体的流程上面也说过了,这里就不再赘述。
我们还可以加大点难度,比如在抠图后不在原图上提示范围,让使用者自己找。
比如我们还可以将抠出来的图镜像一下,让使用者自己找。
比如我们还可以将抠出来的图隔像素点抽样一下。
比如我们还可以将抠出来的图中的像素调整一下颜色。
。。。

http://www.dinnco.com/news/19249.html

相关文章:

  • 山西网站建设开发团队茶叶网络推广方案
  • 专业积分商城网站建设搜索引擎排名优化seo课后题
  • 支付网站建设费入什么科目搜索引擎推广方案
  • 海尔网站建设内容策划郑州网站营销推广
  • 网站优化是做什么的win7优化工具
  • 网站建设与管理 教材2021年最为成功的营销案例
  • wordpress做表格免费优化
  • 佛山专业网站建设深圳网络推广营销公司
  • 韩国美食做视频网站有哪些网站引流推广软件
  • 2012r2做网站seo三人行网站
  • 手机网站建设制作公司seo排名点击软件推荐
  • 邹城网站建设zc273500小说网站排名
  • 日用品网站模板体验式营销经典案例
  • 北京营销型网站建设品牌推广活动方案
  • 淘宝客是如何做网站与淘宝对接的百度关键词优化多少钱一年
  • 百度做网站骗人到哪里去投诉最近国际新闻大事20条
  • 百度推广 做网站seo优化关键词排名优化
  • banner免费设计网站搜索量最大的关键词
  • 聊城网站建设包括哪些百度知道小程序
  • 做网站待遇深圳seo优化服务
  • 去年做那些网站能致富郑州seo优化顾问热狗
  • 娱乐网站设计多少行业网站建站推广
  • 一般网站后台都是哪里做济南seo的排名优化
  • wordpress 评论显示头像优化公司结构
  • 想做个电影网站该怎么做十大免费网站推广平台有哪些
  • 做班级网站的素材个人网站首页设计
  • 石家庄网站制作报价阜新网络推广
  • 潢川微信网站建设seo关键词优化报价价格
  • 哪些网站可以做任务赚钱cctv 13新闻频道
  • 销售网站内容设计方案凤山网站seo