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

南昌网站建设志博谷歌外贸网站建站

南昌网站建设志博,谷歌外贸网站建站,做网站装什么服务器,设计师主题 wordpress【高心星出品】 文章目录 Canvas制作个人签名案例介绍运行结果 开发步骤完整代码 Canvas制作个人签名 Canvas提供画布组件,用于自定义绘制图形,开发者使用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象在Canvas组件上进行绘制&…

【高心星出品】

文章目录

      • Canvas制作个人签名
        • 案例介绍
          • 运行结果
        • 开发步骤
        • 完整代码

Canvas制作个人签名

Canvas提供画布组件,用于自定义绘制图形,开发者使用CanvasRenderingContext2D对象和OffscreenCanvasRenderingContext2D对象在Canvas组件上进行绘制,绘制对象可以是基础形状、文本、图片等。

案例介绍

使用鸿蒙Canvas制作个人签名是一种在HarmonyOS系统环境下,利用Canvas组件实现手写签名功能的技术。以下是对该技术的详细介绍:

  1. 基础准备
    • 环境搭建:确保开发环境已正确配置,包括安装HarmonyOS SDK及相关开发工具,以便进行应用程序的开发和调试。
    • 创建项目:在开发环境中创建一个新的鸿蒙应用项目,并选择合适的应用模板,如空应用模板等。
  2. 页面布局与Canvas初始化
    • 页面布局:在项目的页面文件中,使用ArkTS语言或其他相关语言设计页面布局,为Canvas签名区域预留合适的空间,并可添加其他相关的按钮或控件,如生成签名按钮、清除按钮等。
    • Canvas初始化:通过创建Canvas组件实例,并设置其宽度、高度、背景颜色等属性来初始化Canvas。可以使用ArkTS中的相关类和方法,如CanvasRenderingContext2D等,来获取Canvas的绘图上下文,以便后续进行绘图操作。
  3. 手势监听与绘制逻辑
    • 手势监听:利用鸿蒙系统的手势监听机制,为Canvas组件添加触摸事件监听器,如PanGesture等,以捕捉用户的手指触摸动作,包括按下、移动和抬起等操作。
    • 绘制逻辑:在触摸事件回调函数中,根据用户的操作实时更新画笔的位置和状态,并通过Canvas的绘图方法将用户的签名轨迹绘制到画布上。例如,在手指按下时记录起始位置,在手指移动时绘制线条,在手指抬起时结束绘制。
  4. 功能扩展与优化
    • 撤销与重做功能:为了提供更好的用户体验,可以实现撤销和重做功能。可以通过记录用户每次绘制的操作步骤,当用户点击撤销按钮时,回退到上一步的操作状态;点击重做按钮时,重新执行被撤销的操作。
    • 签名生成与保存:用户可以点击生成签名按钮,将Canvas上的签名内容转换为图片格式,如PNG或JPEG等,并保存到本地存储或上传到服务器,以便后续使用。
    • 界面美化与交互优化:对签名界面进行美化,如添加边框、阴影等效果,提升视觉效果。同时,优化交互细节,使签名过程更加流畅和自然。

综上所述,使用鸿蒙Canvas制作个人签名技术涉及多个方面。这种技术为用户在鸿蒙设备上提供了一种便捷、高效的手写签名方式,可应用于电子合同签署、表单填写等多种场景。

运行结果

在这里插入图片描述

开发步骤

整体布局

整体布局是两个层叠的Canvas画板,居于顶部绘制了绿色的十字网格,居于底部接受用户的手势动作,来绘制线段。

这里为了不被上层Canvas阻止事件传递,使用.hitTestBehavior(HitTestMode.Transparent)方法。

Stack() {// 负责绘制Canvas(this.canvascontext).width(300).height(300).backgroundColor(Color.Grey).onReady(() => {}).onTouch((event) => {let x1 = 0let y1 = 0if (event.type == TouchType.Down) {this.x = event.touches[0].xthis.y = event.touches[0].y} else if (event.type == TouchType.Move) {x1 = event.touches[0].xy1 = event.touches[0].y// 手指滑动的时候 跟着手指绘制this.drawtings((width: number, height: number) => {this.drawline(x1, y1)})this.x = x1this.y = y1}})// 只绘制绿色十字Canvas(this.canvascontext1).width(300).height(300).backgroundColor(Color.Transparent).onReady(() => {this.drawshi1()})// 不阻止事件传递.hitTestBehavior(HitTestMode.Transparent)
}

清空按钮和提交按钮

清空按钮负责清空画板,提交按钮负责将底层画板绘制的内容转化成图片,在下面的image中展示。

Row(){// 底层画板清屏Button('清空').onClick(()=>{let width=this.canvascontext.widthlet height=this.canvascontext.heightthis.canvascontext.clearRect(0, 0, width, height)})// 将绘制内容转化成图片展示Button('提交').onClick(()=>{let width=this.canvascontext.widthlet height=this.canvascontext.heightthis.pm= this.canvascontext.getPixelMap(0,0,width,height)})
}
.width('100%')
.justifyContent(FlexAlign.SpaceAround)
Image(this.pm).width(200).height(200)

标准绘制过程

// 标准绘制模板 clear---save---设置绘制属性 开始绘制 绘制结束--restore呈现
// draw 是具体的绘制过程 isclear 是在绘制前是否清屏
drawtings(draw:(width:number,height:number)=>void,isclear:boolean=false){let width=this.canvascontext.widthlet height=this.canvascontext.heightif(isclear) {this.canvascontext.clearRect(0, 0, width, height)}this.canvascontext.save()draw(width,height)this.canvascontext.restore()
}

绘制上层十字画板

上层十字画板要绘制两个线段,一个水平,一个垂直

//绘制十字方法
drawshi1() {let width = this.canvascontext1.widthlet height = this.canvascontext1.heightthis.canvascontext1.clearRect(0, 0, width, height)this.canvascontext1.save()// 线条粗细this.canvascontext1.lineWidth = 2// 线条颜色this.canvascontext1.strokeStyle = '#00ff00'// 线条虚线间隔this.canvascontext1.setLineDash([10, 20])// 开始绘制this.canvascontext1.beginPath()this.canvascontext1.moveTo(width as number / 2, 0)this.canvascontext1.lineTo(width as number / 2, height)this.canvascontext1.closePath()// 绘制结束this.canvascontext1.stroke()this.canvascontext1.beginPath()this.canvascontext1.moveTo(0, height as number / 2)this.canvascontext1.lineTo(width, height as number / 2)this.canvascontext1.closePath()this.canvascontext1.stroke()this.canvascontext1.restore()
}

绘制手势线段

根据手势事件获取坐标点,然后将这些点链接在一起形成线段。

//画线段
drawline(x1:number,y1:number){this.canvascontext.lineWidth=3this.canvascontext.beginPath()this.canvascontext.moveTo(this.x, this.y)this.canvascontext.lineTo(x1,y1)this.canvascontext.closePath()this.canvascontext.stroke()
}
完整代码
@Entry
@Component
struct Canvaspage1 {@State message: string = 'Hello World';// 定义了两个canvas画板 两个设置项private settings:RenderingContextSettings=new RenderingContextSettings(true)private canvascontext:CanvasRenderingContext2D=new CanvasRenderingContext2D(this.settings)private settings1:RenderingContextSettings=new RenderingContextSettings(true)private canvascontext1:CanvasRenderingContext2D=new CanvasRenderingContext2D(this.settings1)// 记录手指滑动坐标private x:number=0private y:number=0// 保存图片@State pm:PixelMap|null=nullbuild() {Column({space:20}){Text('签名').fontSize(20).fontWeight(FontWeight.Bolder)// 层叠了两个画板 一个负责显示绿十字  一个负责接受绘制Stack() {// 负责绘制Canvas(this.canvascontext).width(300).height(300).backgroundColor(Color.Grey).onReady(() => {}).onTouch((event) => {let x1 = 0let y1 = 0if (event.type == TouchType.Down) {this.x = event.touches[0].xthis.y = event.touches[0].y} else if (event.type == TouchType.Move) {x1 = event.touches[0].xy1 = event.touches[0].y// 手指滑动的时候 跟着手指绘制this.drawtings((width: number, height: number) => {this.drawline(x1, y1)})this.x = x1this.y = y1}})// 只绘制绿色十字Canvas(this.canvascontext1).width(300).height(300).backgroundColor(Color.Transparent).onReady(() => {this.drawshi1()})// 不阻止事件传递.hitTestBehavior(HitTestMode.Transparent)}Row(){// 底层画板清屏Button('清空').onClick(()=>{let width=this.canvascontext.widthlet height=this.canvascontext.heightthis.canvascontext.clearRect(0, 0, width, height)})// 将绘制内容转化成图片展示Button('提交').onClick(()=>{let width=this.canvascontext.widthlet height=this.canvascontext.heightthis.pm= this.canvascontext.getPixelMap(0,0,width,height)})}.width('100%').justifyContent(FlexAlign.SpaceAround)Image(this.pm).width(200).height(200)}.height('100%').width('100%').justifyContent(FlexAlign.Center)}//画线段drawline(x1:number,y1:number){this.canvascontext.lineWidth=3this.canvascontext.beginPath()this.canvascontext.moveTo(this.x, this.y)this.canvascontext.lineTo(x1,y1)this.canvascontext.closePath()this.canvascontext.stroke()}// 标准绘制模板 clear---save---设置绘制属性 开始绘制 绘制结束--restore呈现// draw 是具体的绘制过程 isclear 是在绘制前是否清屏drawtings(draw:(width:number,height:number)=>void,isclear:boolean=false){let width=this.canvascontext.widthlet height=this.canvascontext.heightif(isclear) {this.canvascontext.clearRect(0, 0, width, height)}this.canvascontext.save()draw(width,height)this.canvascontext.restore()}//绘制十字方法drawshi1() {let width = this.canvascontext1.widthlet height = this.canvascontext1.heightthis.canvascontext1.clearRect(0, 0, width, height)this.canvascontext1.save()// 线条粗细this.canvascontext1.lineWidth = 2// 线条颜色this.canvascontext1.strokeStyle = '#00ff00'// 线条虚线间隔this.canvascontext1.setLineDash([10, 20])// 开始绘制this.canvascontext1.beginPath()this.canvascontext1.moveTo(width as number / 2, 0)this.canvascontext1.lineTo(width as number / 2, height)this.canvascontext1.closePath()// 绘制结束this.canvascontext1.stroke()this.canvascontext1.beginPath()this.canvascontext1.moveTo(0, height as number / 2)this.canvascontext1.lineTo(width, height as number / 2)this.canvascontext1.closePath()this.canvascontext1.stroke()this.canvascontext1.restore()}
}

文章转载自:

http://995PpYlq.spsqr.cn
http://PnYVByVc.spsqr.cn
http://zU6cGqcT.spsqr.cn
http://zTkIEjCL.spsqr.cn
http://NbY8ZRui.spsqr.cn
http://HZTrjj2P.spsqr.cn
http://YhnniPli.spsqr.cn
http://FRLhK7Qn.spsqr.cn
http://r6k41t62.spsqr.cn
http://Aoim7yTa.spsqr.cn
http://X7SOezSV.spsqr.cn
http://EenzhCD2.spsqr.cn
http://qpJoj0sK.spsqr.cn
http://7YVDTO5V.spsqr.cn
http://82sJjYGN.spsqr.cn
http://gF4QLRhb.spsqr.cn
http://hdqMLd8j.spsqr.cn
http://m2yIgamq.spsqr.cn
http://fjxRskiD.spsqr.cn
http://NOhXizYH.spsqr.cn
http://K0ULxTxB.spsqr.cn
http://kOhZYk1q.spsqr.cn
http://Zk3KWfW3.spsqr.cn
http://UMUzpg8j.spsqr.cn
http://vHw1pfSE.spsqr.cn
http://BHYhTJO2.spsqr.cn
http://NXBqZxny.spsqr.cn
http://wCGxquWm.spsqr.cn
http://omoJDKiO.spsqr.cn
http://QR6cIMod.spsqr.cn
http://www.dtcms.com/wzjs/758951.html

相关文章:

  • 招聘网站建设公司wordpress主题代码编辑教程
  • 开平网站建设汕头有没有做网站
  • 阿里云做的网站程序小型办公室装修
  • 外贸网站设计模板汽车租赁网站建设内容
  • 客户要做网站建设话术梅州建站怎么做
  • 长沙企业建站公司wordpress同步微信素材
  • 网站建设公司与前端莱芜app下载
  • 专业做网站平台淘宝买模板注浆做网站
  • 浙江金圣建设有限公司网站如何学做网站
  • 南昌网站建设公司烟台品牌网站建设
  • 如何开发微网站网站建设数据的保密性
  • 合肥网站建设 合肥网络推广青岛网站建设订做
  • 端子网站建设ue4培训班一般学费多少
  • 防城港网站建设太原网站建站模板
  • 三明网站设计建网站要多少钱一台
  • 沂水网站开发深圳网站建设网页推广网站设计
  • h5动画网站旅游网站建设规划方案
  • 2023年最新科技新闻摘抄分站城市网站如何做seo
  • 常德网站建设字答科技jsp网站开发源码实例
  • 如何做后台管理员网站苏州有什么好玩的景点
  • 怎么安装网站代码wordpress企业网站开发
  • app开发导入网站模板建公司网站步骤
  • 国内投资咨询网站 html模板前端网站开发课程
  • 城市网站改版建设专业网站开发制作
  • 做网站app怎么赚钱吗网站备案信息被工信部删除
  • 青岛网站建设报价做led灯网站有哪些呢
  • strikingly建站怎么样给公司建网站需要多少钱
  • 购物网站后台管理模板网站费用属于哪个费用
  • 做网站 多少人wordpress主题文件夹在哪里设置
  • 洛阳建网站松江品划网站建设推广