• 用HTML5 Canvas做一个画图板


    使用HTML5可以非常简单地在canvas上实现画图应用,用支持html5的浏览器便可在下面的区域进行绘画,要看到演示效果,请确保你的浏览器支持HTML5:

    功能很简单,原理其实和拖放是类似的,主要是三个事件:

    1. 在canvas 上绑定mousedown 事件以标志绘画的开始(调用moveTo 移动画笔)
    2. 在document 上绑定mousemove 事件来处理绘画时的行为(调用lineTo 以及stroke 进行绘画)
    3. 在document 上绑定mouseup 事件以标志绘画的结束(解绑document 上的两个事件)

    实现时需特别注意的一点是调用moveTo 以及lineTo 方法时如何传递正确的坐标值,这个坐标值应该是光标相对于canvas 左上角的偏移量,获取时需要把canvas 相对于当前视口的位置考虑进去,getBoundingClientRect 方法则正好派上了用场(支持HTML5 的浏览器应该都实现了这个方法),最后用event 对象的clientX, clientY 减去getBoundingClientRect 方法返回的left, top 值即可。

    下面是实现代码:

    01 // <![CDATA[
    02 function Draw(arg) {
    03     if (arg.nodeType) {
    04         this.canvas = arg;
    05     } else if (typeof arg == 'string') {
    06         this.canvas = document.getElementById(arg);
    07     } else {
    08         return;
    09     }
    10     this.init();
    11 }
    12 Draw.prototype = {
    13     init: function() {
    14         var that = this;
    15         if (!this.canvas.getContext) {
    16             return;
    17         }
    18         this.context = this.canvas.getContext('2d');
    19         this.canvas.onselectstart = function () {
    20             return false//修复chrome下光标样式的问题
    21         };
    22         this.canvas.onmousedown = function(event) {
    23             that.drawBegin(event);
    24         };
    25     },
    26     drawBegin: function(e) {
    27         var that = this,
    28             stage_info = this.canvas.getBoundingClientRect();
    29         window.getSelection ? window.getSelection().removeAllRanges() :
    30                                 document.selection.empty();  //清除文本的选中
    31         this.context.moveTo(
    32             e.clientX - stage_info.left,
    33             e.clientY - stage_info.top
    34         );
    35         document.onmousemove = function(event) {
    36             that.drawing(event);
    37         };
    38         document.onmouseup = this.drawEnd;
    39     },
    40     drawing: function(e) {
    41         var stage_info = this.canvas.getBoundingClientRect();
    42         this.context.lineTo(
    43             e.clientX - stage_info.left,
    44             e.clientY - stage_info.top
    45         );
    46         this.context.stroke();
    47     },
    48     drawEnd: function() {
    49         document.onmousemove = document.onmouseup = null;
    50     }
    51 };
    52 var draw = new Draw('the_stage');
    53 // ]]>

    就这样一个简单的鼠绘功能就完成了,不足之处也有,比如不能够画点。。。 我个人觉得用canvas 来做画图还是比较弱的,复杂一些的功能就不太好实现了,不过大家也可以尝试下哦,比如要添加个保存图片的方法,定义Draw.prototype.save = function() {...},其中可调用toDataURL 方法实现。

  • 相关阅读:
    零代码实现接口自动化测试RF框架实践
    【js】script标签中的async和defer属性
    【vue】preload与prefetch的使用和区别
    【js】对象属性名为对象时
    【vue】 vuedevtoos 工具
    【js】call、apply和bind的区别
    【js】防抖节流理解及应用场景
    Arthas(3):jvm相关命令
    frp:通过公网域名访问内网机器
    Arthas(5):monitor watch trace 相关
  • 原文地址:https://www.cnblogs.com/xiaoyang002/p/4027953.html
Copyright © 2020-2023  润新知