zoukankan      html  css  js  c++  java
  • Html5 Canvas一个简单的画笔例子

    相比了下Qt quick的canvas和HTML5的canvas,发现HTML5 Canvas在同样绘制绘制操作下性能比Qt的canvas强很多,附上一个HTML5 canvas画笔一例子

    var DW  = function( canvasid){
       this._points = [];
       this._canvas = document.getElementById( canvasid );
       this._ctx = this._canvas.getContext("2d");
       this._isPressed = false;
       this._color  = "#223344";
       this._widht = 8;
    
       var self = this;
    
       function __init(){
          self._ctx.lineCap = "round";
          self._ctx.lineJoin="round";
          self._ctx.strokeStyle = self._color;
          self._ctx.lineWidth = self._widht;
       };
    
       this._addPoints = function( x, y ){
        this._points.push({x: x , y : y });
       };
    
       this._capturePath = function( x , y ){
        this._addPoints( x,  y );
       };
    
       this._prepareDrawing = function( x, y ){
        this._points.length = 0 ;
        this._addPoints( x, y );
        this._ctx.moveTo( x, y );
       };
    
       this._render = function(){
       	console.log("renderrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr");
        var p1 = this._points[0] , p2 =this._points[1];
        this._ctx.save();
        this._ctx.beginPath();
    
        if(this._points.length === 2 && p1.x === p2.x && p1.y===p2.y ){
          p1.x -= 0.5 ;
          p1.y -= 0.5 ;
        }
    
        this._ctx.moveTo( p1.x , p1.y );
    
        for( var i = 1 , len = this._points.length ; i < len ; i++ ){
          var mp = {x : (p1.x + (p2.x - p1.x ) /2) , y : (p1.y + (p2.y - p1.y)/2)};
          this._ctx.quadraticCurveTo( p1.x , p1.y , mp.x , mp.y );
          p1 = this._points[i] ; p2 = this._points[i+1];
        }
    
        this._ctx.lineTo( p1.x , p1.y );
        this._ctx.stroke();
        this._ctx.restore();
       }
    
       this._clearContext = function(){
          this._ctx.clearRect(0,0, this._canvas.width , this._canvas.height);
       }
       __init();
    
    };
    
    DW.prototype.setColor = function(color){ 
      this._color = color;
      this._ctx.strokeStyle = color;
    };
    
    DW.prototype.setWidth = function( w ){
      this._widht = w;
      this._ctx.lineWidth = w ;
    }
    

      

    应用

    <!doctype html>
      <html>
        <head>
         <title> Canvas </title>
         <style type="text/css">
           canvas{
           	 border-radius: 8;
           	 border-style: solid;
           	 border-color: 'gray'
           }
         </style>
         <script ==> 引用上头JS文件 =========/script>
        </head>
        <body>
          <canvas id="_canvas" width='500' height="400" ></canvas>
          <script type="text/javascript">
           var $ = function( id ){ return document.getElementById(id);}
           var c = $('_canvas');
           var dObject = new DW("_canvas");
           function on_mouse_press(e){
                    dObject.setColor("#778899");
                    dObject._prepareDrawing(e.offsetX,e.offsetY);
                    dObject._capturePath(e.offsetX,e.offsetY);
                    dObject._render();
    
                    dObject._isPressed = true;
            };
    
            function on_mouse_move( e) {
                     if( dObject._isPressed === true ){
                          dObject._capturePath(e.offsetX,e.offsetY);
                          dObject._clearContext();
                         dObject._render(); //redraw
             }
          };
    
           function on_mouse_up(e){
               dObject._isPressed = false;
           }
    c.addEventListener('mousedown',function(e){ on_mouse_press(e); },false); c.addEventListener('mousemove' , function(e){ on_mouse_move(e); },false); c.addEventListener('mouseup',function(e){ on_mouse_up(e); },false); </script> </body> </html>

      

  • 相关阅读:
    彻底弄懂flex布局
    剖析Vue原理&实现双向绑定MVVM
    【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
    mysql 排序
    从ReentrantLock的实现看AQS的原理及应用
    Java面试之Synchronized解析
    基于vue-cli搭建vue项目开发环境
    在win环境下使用yarn安装 vue-cli
    优化器追踪示例
    MySQL常见的七种锁详细介绍
  • 原文地址:https://www.cnblogs.com/andy1987/p/4446101.html
Copyright © 2011-2022 走看看