功能展示:

这里显示不了图片,就算了吧。。。。

功能具体实现:

参数配置:

varDEFAULT_BRUSH_SIZE =3;//设置画笔的粗细varDEFAULT_BRUSH_COLOR ="#000000";//设置画笔的颜色varBACKGROUND_COLOR ="#FFFFFF";//设置画布的背景颜色varcut =0;//设置断点varpoint = {};//记录画笔的位置varnext_point = {};//记录下一个画笔的位置varcontext;//context上下文

其中说明下context上下文的作用:html5中canvas本身是不具有绘画功能的,就是一个画布,类似于Java中的一个panel,而context可以提供在画布中绘画的方法和属性,通过canvas.getContext()得到

补充一点:因为是实现签字功能,其实就是实现两点之间画直线,需要一个起始点和一个终点,也就是上面参数设置的:point和next_point

这里我们需要不断的监控point和next_point的变化:

首先设置x和y的坐标:

function@H_403_137@setPoint(x,y){//不断执行varn_point= {};n_point.x=x;n_point.y=y;returnn_point;}

function@H_403_137@upDate(up_point){//不断执行if(!next_point){

next_point = @H_403_137@setPoint(0,0);}else{

next_point = @H_403_137@setPoint(up_point.x,up_point.y);}

}

因为要不断的监控坐标的变化,这里我另外封装了一个方法,一遍调用它(其实后来我在想,为什么要另外封装一个方法,不能直接调用呢?\(^o^)/)

调用如下:

function@H_403_137@loop(e){

@H_403_137@upDate(point);}

下面是初始化画布和画笔的操作:

function@H_403_137@init(){varcanvas=document.getElementById("canvas");varcanvasWidth=canvas.width=window.innerWidth;//获取画布的宽度varcanvasHeight=canvas.height=window.innerHeight;//获取画布的高度context =canvas.getContext('2d');//获取画布上下文context.fillStyle= BACKGROUND_COLOR;//设置背景填充颜色context.fillRect(0,0,canvasWidth,canvasHeight);//设置画布背景point.x=0;point.y=0;canvas.addEventListener('touchmove',@H_403_137@touchMove,false);canvas.addEventListener('touchstart',@H_403_137@touchStart,false);canvas.addEventListener('touchend',@H_403_137@touchEnd,false);document.getElementById("chonghua").addEventListener('click',@H_403_137@chonghua,false);document.getElementById('backButton').addEventListener('click',@H_403_137@backAction,false);setInterval(@H_403_137@loop,1);}

默认的第一个点为(0,0)其中需要说明的就是setInterval()方法,这个就是实现了不断地调用,一旦启动,就会不停的调用

clearInterval(setInterval(function,time))这个方法

因为是手机端,所以在上面注册touchmove、touchstart、touchend方法

下面是绘图的方法:

function@H_403_137@draw(context){if(cut >1){//context.save;//保存当前绘画状态context.fillStyle= DEFAULT_BRUSH_COLOR;//设置填充的背景颜色context.lineWidth= DEFAULT_BRUSH_SIZE;//设置画笔的大小context.lineCap="tound";//设置线条,让线条更加的圆润context.beginPath();context.moveTo(point.x,point.y);context.lineTo(next_point.x,next_point.y);console.log("画笔"+ cut);context.stroke();context.restore();//回复绘画状态}

}

下面是对应的touchmove,touchstart,touchend方法

//触摸滑动事件function@H_403_137@touchMove(){vare=event.touches[0];console.log("touchMove");point = @H_403_137@setPoint(e.clientX,e.clientY);$pos_display.innerHTML='你上一点鼠标的位置为('+ point.x+','+ point.x+').
你当前鼠标的位置为('+ next_point.x+','+ next_point.x+')';//更新当前鼠标点击的位置@H_403_137@draw(context);cut++;}

//触摸开始事件function@H_403_137@touchStart(){console.log("touchStart");varcanvas=document.createElement('canvas');varcontent=document.getElementById('canvasContent');content.appendChild(canvas);canvas.width=window.innerWidth;canvas.height=window.innerHeight;canvas.addEventListener('touchmove',false);context =canvas.getContext('2d');@H_403_137@draw(context);cut =1;}

//触摸结束时间function@H_403_137@touchEnd(){console.log("touchEnd");document.getElementById("canvas").getContext('2d').save();}

其中需要注意点是断点连续的问题:

这一笔画完,和下一笔开始时,首尾链接到一起去了

所以这里我的处理方法是:】

设置一个cut断点,开始触发时,把断点设为1;在draw方法中判断断点,如果断点为1则不执行任何操作,touchmove方法中让断点累加

这样就实现了基本的签字功能

撤销功能:

Canvas中有一个restore方法,可以返回到save操作的那个状态,然而我使用的时候并没有什么卵用 (*  ̄︿ ̄)

因为canvas是透明的!!!这就联想到ps中图层的效果,最终展现的时候是每个图层的叠加,

每touchstart的时候就新建一个图层()

实现:

//撤销上一次操作function@H_403_137@backAction(){console.log(document.getElementsByTagName("canvas").length);if(document.getElementsByTagName("canvas").length==1){

@H_403_137@chonghua();}else{document.getElementById('canvasContent').removeChild(document.getElementsByTagName("canvas")[document.getElementsByTagName("canvas").length-1]);}

}

注意新建的,html中是以堆栈管理的,所以删除应该是删除最上面的一个图层

所以重画 也就非常简单了:不断地调用撤销操作:

//重画function@H_403_137@chonghua(){varmax=document.getElementsByTagName("canvas").length-1;for(vari=max;i>0;i--){document.getElementById('canvasContent').removeChild(document.getElementsByTagName("canvas")[document.getElementsByTagName("canvas").length-1]);}if(document.getElementsByTagName("canvas").length==1){varcontext=document.getElementById('canvas').getContext('2d');context.fillStyle="#ffffff";context.fillRect(0,window.innerWidth,window.innerHeight);};}

这里貌似我写的有些复杂,让撤销调用了重画的方法,其实代码可以简化下的o(一︿一+)o

保存的时候有些麻烦:需要将每一个图层(下面就用图层来代替canvas)合并为一个图层,又类似ps中的图层合并

思想就是调用context中的drawImage方法,图层绘画图层,但是后来发现绘画玩,底层的图层和上面的图层就有很多的重合,撤销和重画功能都不灵了,具体的解决步骤如下:

function@H_403_137@drawImg(img){varcanvas=document.getElementById("canvas");returncanvas.getContext('2d').drawImage(img,0);}

$scope.saveImg =function(){varcanvas=document.getElementById("canvas");varcanvasLength=document.getElementsByTagName("canvas").length-1;for(vari=canvasLength;i>0;i--){

@H_403_137@drawImg(document.getElementsByTagName("canvas")[i]);document.getElementById("canvasContent").removeChild(document.getElementsByTagName("canvas")[i])}vardataUrl=canvas.toDataURL();$scope.globalNavigator.pushPage('main/crm/img.html',{animation:"fade",src:dataUrl})}

其中需要说明下的就是context中的toDataURL();默认转成png格式的,当然也可以自己指定,在toDataURL中加上参数即可

网上都有说要base64.js和canvas2image.js,才能转成图片保存,当然我也下载了,当时后来我把两个引入注释掉,貌似功能并没有收到影响  O(∩_∩)O哈哈~

html5页面签字,html5 canvas实现的手机端签字板相关推荐

  1. html5中canvas画布实现手机端和移动端的刮刮乐效果

    用html5中的canvas实现刮刮乐的效果 使用html+css实现背景的样式 使用clearRect()方法实现挂去的作用 手机端使用addEventListener()监听 手机端滑动事件tou ...

  2. 在html5页面中添加canvas,HTML页面中添加Canvas标签示例

    在HTML页面的 中,可以用像下面的代码来添加标签: 复制代码代码如下: Your browser does not support HTML5 Canvas. 译注:对于canvas,以下写法是不允 ...

  3. html5页面主题,HTML5页面开发笔记

    页面由设计决定, 所以首先聊聊设计稿 前戏, 页面设计规范 PSD设计稿的图层 "分组" 以及图层 "命名": 设计稿中的每一个元素, 比如 唱片机, 设计师需 ...

  4. 跨平台html5页面代码,HTML5+CSS3跨平台网页设计实例教程

    HTML5+CSS3跨平台网页设计实例教程 编辑 锁定 讨论 上传视频 <HTML5+CSS3跨平台网页设计实例教程>是2018年8月清华大学出版社出版的图书,作者是陈承欢.韩耀坤.颜珍平 ...

  5. html5手机页面测试,HTML5 页面测试

    HTML5 页面测试 HTML5最初诞生于PC端,很大程度依赖于硬件,现如今手机/平板硬件飞速发展,所以这个已然不是瓶颈了,谷歌移动版Chrome支持HTML5网址.HTML5视频,并且具备具备硬件加 ...

  6. 7.2判断是否手机端进行访问页面

    具体要求:1.判断访问的用户是否使用手机端进行访问,如果是,则重定向到手机页面 2.无论手机或者电脑端都必须循环播放图片 3.电脑端图片宽300,高200 像素.手机端图片宽设置为100%,高为200 ...

  7. 同一个网站,手机端跟电脑端显示不同是怎么实现的?...

    同一个网站,手机端跟电脑端不同是怎么实现的? 常见的方式有三种: 1,自适应网站 同一套代码,自动实现手机端和电脑端的布局自动调整.例如:openGPS.cn 网站现在大部分页面已经支持自适应展示,手 ...

  8. html手机和电脑显示内容不同,同一个网站,手机端跟电脑端显示不同是怎么实现的?...

    同一个网站,手机端跟电脑端不同是怎么实现的? 常见的方式有三种: 1,自适应网站 同一套代码,自动实现手机端和电脑端的布局自动调整.例如:openGPS.cn 网站现在大部分页面已经支持自适应展示,手 ...

  9. JS判断设备是手机端还是PC端,并加载不同的css/js文件

    最近公司有个页面需要做pc端和手机端的页面自适应,即手机打开是指定的样式,pc打开则是pc指定的样式,样式是前端ui已经设计好了的. 所以这里需要通过Navigator userAgent 属性判断浏 ...

  10. 自适应网页设计的方法(手机端良好的访问体验)

    一.在HTML头部增加viewport标签.  很多时候我们开发的页面需要自适应移动端和手机端,那么如何实现呢?其实很简单,看下面 先看一个简单的网页代码 <html><head&g ...

最新文章

  1. 关于String数组的用法
  2. python教程:读取.dcm文件,并转化为.jpg格式
  3. NYOJ 589 糖果
  4. Django日志信息路径的设置
  5. SAP Spartacus index.html 里的 occ-backend-base-url 如何被解析的?
  6. 算法研究:插入类排序(简单插入,折半插入,希尔排序)
  7. salt-api安装与配置
  8. 链表的应用 —— 实现 LRU(least recently unused)
  9. mysql 2100_mysql增量备份与恢复实战
  10. 搜索系统中的纠错问题
  11. 第五章 高级发布-订阅模式
  12. 来自Unix/Linux的编程启示录
  13. 十本Java网站开发必看书籍
  14. 用友U8安装客户端时提示已经安装过智能客户端
  15. 怎样学习Peoplesoft -byl vhonglei
  16. CME基础实验六:CME和CUE集成,实现Voice-mail
  17. Hihocoder 顺子
  18. [nRF52832开发板:Nordic Thingy:52]Nordic Thingy:52到手
  19. windows下实现定时任务重启多台tomcat
  20. Windows Hook 易核心编程勾子基本理念

热门文章

  1. python_四元数q转旋转矩阵R(已验证)
  2. 随笔小杂记(六)——tqdm进度条显示出现多余行
  3. 论文投稿,遭遇身份歧视该咋办?
  4. 完整的tensorflow训练、保存和离线加载模型(以mnist为例)
  5. 关于new FormData() 对象的用法
  6. 钉钉自定义机器人 发送文本 换行 \n无效果
  7. AS中几个较好的插件
  8. centos挂载ntfs文件系统
  9. ALSA声卡10_从零编写之数据传输_学习笔记
  10. Exchange 2016 体系结构