码迷,mamicode.com
首页 > Web开发 > 详细

HTML5 canvas 在线画笔绘图工具(二)

时间:2015-02-26 13:18:30      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

Canvas+Javascript 带图标的工具条制作 TToolbar

 

工具条是由一个TToolbar对象和两个按钮对象(TImageButton、TColorButton)组成,因为之前我大部分时间是使用d.e.l.p.h.i进行开发,所以命名方面比较偏向于d.e.l.p.h.i的风格,请处女座的同学忍耐将就一下。

 

图标按钮 TImageButton

 

TImageButton 是一个图标按钮对象,可以设置三个图标文件,分别是正常状态,鼠标移上状态,鼠标点击状态。

 

下面我们介绍一下TImageButton的参数:

 

Command是按钮对应的功能编号,比如我们定义1为直线,2为矩形.

NormalSrc, MouseOnSrc, MouseDownSrc 分别为正常状态,鼠标移上状态,鼠标点击状态 的图标地址。

x, y, width, height 按钮在工具条上的位置和尺寸。

Toolbar 为宿主工具条。

Group 是按钮所属分组。

[javascript] view plaincopy
  1. function TImageButton(Command,  
  2.                       NormalSrc,  
  3.                       MouseOnSrc,  
  4.                       MouseDownSrc,  
  5.                       x,  
  6.                       y,  
  7.                       width,  
  8.                       height,  
  9.                       Toolbar,  
  10.                       group)  
  11. {  
  12. }  

 

下面为在Canvas上绘制按钮图标的代码

当鼠标移进按钮或鼠标移出按钮时,将调用ChangeState来改变按钮的状态.为按钮设置不同的图标属性,然后通过Clear()函数将原来的图素清除,再利用RenderImage函数绘制新的按钮。

 

 

[javascript] view plaincopy
  1. function Clear() {  
  2.     Context.clearRect(Toolbar.x + x, Toolbar.y + y, width, height);  
  3. }  
  4.   
  5. function LoadImage(newsrc) {  
  6.   
  7.     image.src = newsrc;  
  8.   
  9.     if (image.complete) {  
  10.         RenderImage(image);  
  11.     } else  
  12.         image.onload = function() {  
  13.             RenderImage(image);  
  14.         };  
  15. }  
  16.   
  17. function RenderImage(image) {  
  18.   
  19.     Context.drawImage(image, Toolbar.x + x, Toolbar.y + y, width, height);  
  20. }  
  21.   
  22. function ChangeState(NewState) {  
  23.   
  24.     state = NewState;  
  25.     Clear();  
  26.     if (NewState == CSN)  
  27.         LoadImage(NormalSrc);  
  28.     else if (NewState == CSO)  
  29.         LoadImage(MouseOnSrc);  
  30.     else if (NewState == CSD)  
  31.         LoadImage(MouseDownSrc);  
  32. }  

 

 

 

 

PointIn函数用于检测鼠标所在位置是否在当前按钮所覆盖区域中。

注意这里的AbsX与AbsY函数,由于鼠标的x值和y值是鼠标在页面中的坐标,而当前TImageButton对象的x,y是其在TToolbar对象中的坐标位置。因此我们在计算该TImageButton所覆盖区域时,应当加上画布在页中的坐标以及TToolbar对象在画布中的偏移量。

 

 

[javascript] view plaincopy
  1. </pre><pre class="javascript" name="code">    function PointIn (testx,testy)  
  2.     {  
  3.        if ((testx>Absx())&&(testx<(Absx()+width))  
  4.           &&(testy>Absy()) && (testy<(Absy()+height)))  
  5.          {  
  6.      
  7.               return true;  
  8.                 
  9.               }  
  10.           else  
  11.              return false;   
  12.                 
  13.     };   

 

  1. function Absx() {  
  2.         return Canvas.offsetLeft + Toolbar.x + x;  
  3.     };  
  4. function Absy() {  
  5.   
  6.         return Canvas.offsetTop + Toolbar.y + y;  
  7.     };  

颜色选择按钮TColorButton

从下面TColorButton对象的建立参数我们可以看到,它与TImageButton基本类似,按照面向对象的法则,应当抽取一个基类,由两个TColorButton和TImageButton来继承。但我还没有学会如何在Javascript中实现对类的继承,所以暂时将它们分成两个完全不相干的类。

注意一下这个建立函数与TImageButton的唯一区别是它的Command参数不再是保存命令的编号,而是保存颜色的值。

 

 

[javascript] view plaincopy
  1. function TColorButton(Command,  
  2.                       x,  
  3.                       y,  
  4.                       width,  
  5.                       height,  
  6.                       Toolbar,  
  7.                       group)  
  8. {  
[javascript] view plaincopy
  1. </pre><pre class="javascript" name="code">}  

我们再来看看它的按钮是如何绘制到画布上的

TColorButton同样有 mousemoveon,mouseleave,click三种状态。当鼠标在按钮上时在颜色选择小框外画一个淡黄色的小框。

 

 

[javascript] view plaincopy
  1. function Clear()  
  2.     {  
  3.        Context.clearRect(Toolbar.x+ x,Toolbar.y+ y,width,height);  
  4.     }  
  5.     function RenderButton()  
  6.     {  
  7.          
  8.        Context.fillStyle=command;  
  9.        Context.fillRect(Toolbar.x+ x, Toolbar.y+ y,width,height);  
  10.        if (state==CSO)  
  11.        {  
  12.           Context.strokeStyle="#FFCC33";  
  13.           Context.lineWidth=2;  
  14.           Context.strokeRect(Toolbar.x+ x+2, Toolbar.y+ y+2,width-4,height-4);   
  15.        }  
  16.     }  
  17.     function ChangeState(NewState)  
  18.     {  
  19.          
  20.        state=NewState;  
  21.        Clear();  
  22.        RenderButton();    
  23.     }  

 

 

 

 

 

 

主工具条TToolbar

[javascript] view plaincopy
  1. function TToolbar(Canvas, x, y, width, height) {  
  2.     var Context = Canvas.getContext(‘2d‘);  
  3.     this.Canvas = Canvas;  
  4.     this.x = x;  
  5.     this.y = y;  
  6.     this.width = width;  
  7.     this.height = height;  
  8.     var CurrentShapeProperty;  
  9.     var BorderColor;  
  10.     btnList = new Array();  
  11.     btnCounter = 0;  
  12.     Create();  
  13. }  

首先我们来看一下TToolbar的建立参数和成员变量

Canvas是工具条的图象载体,与用户交互的UI元素. x,y 为工具条在画布(Canvas) 上的偏移量,width,height分别为工具条的宽度和高度.

定义画布的上下文

var Context = Canvas.getContext(‘2d‘);

CurrentShapeProperty 用于记录选择的一些图形属性 如画笔的宽度,颜色等.

 

TToolbar负责做两件重要的工作

1.判断鼠标移动到了哪个按钮或者鼠标点击了哪个按钮.

利用 InstallEvents 绑定工具条的画布Canvas鼠标事件.

mousemove函数逐个判断当前工具条所管理的按钮是否获得了鼠标焦点. 如果当前鼠标移到了该按钮上,将该按钮的图标设为相应图标(在testHit函数中).其余图标设置为普通状态.

mousedown 函数逐个判断当前工具条所管理的按钮是否获得了鼠标点击.如果是颜色按钮则将当前选中的颜色值拷贝到大颜色按钮.

[javascript] view plaincopy
  1. mousemove = function(event) {  
  2.     var Current = null;  
  3.     for (var i = 0; i < btnList.length; i++) {  
  4.         if (btnList[i].testHit(event.clientX, event.clientY) == true)  
  5.             Current = btnList[i];  
  6.     }  
  7.     if (Current != null) {  
  8.         for (var i = 0; i < btnList.length; i++) {  
  9.                 if ((btnList[i] != Current) && (btnList[i].getisChecked() == false))  
  10.                     btnList[i].setNormal();  
  11.         }  
  12.     }  
  13. };  
  14. mousedown = function(evnet) {  
  15.     var Current = null;  
  16.     for (var i = 0; i < btnList.length; i++) {  
  17.   
  18.         if (btnList[i].testMouseDown(event.clientX, event.clientY) == true)  
  19.             Current = btnList[i];  
  20.     }  
  21.     if (Current != null) {  
  22.         for (var i = 0; i < btnList.length; i++) {  
  23.             if (Current.getGroup() == btnList[i].getGroup()) {  
  24.                 if (btnList[i] != Current)  
  25.                     btnList[i].setNormal();  
  26.             }  
  27.         }  
  28.         if (Current.getGroup()==3)  
  29.         {  
  30.           var Color=Current.Command();  
  31.           ColorSelected(Color);  
  32.          }  
  33.     }  
  34.       
  35. };  
  36.   
  37. //安装鼠标移动、点击等方法  
  38. this.InstallEvents = function() {  
  39.     Canvas.onmousemove = function(event) {  
  40.         mousemove(event);  
  41.     };  
  42.     Canvas.onmousedown = function(event) {  
  43.         mousedown(event);  
  44.     };  
  45. };  

 

另外我之前想用以下方法来绑定鼠标事件,没有成功请帮看一下问题出在哪里,谢谢

 

[javascript] view plaincopy
  1. function AddEvent(element, eventName, eventHandler) {  
  2.     window.alert( typeof element.addEventListener);  
  3.     if ( typeof element.addEventListener != "undefined") {  
  4.         window.alert(eventHandler);  
  5.         element.addEventListener(eventName, eventHandler, false);  
  6.         window.alert(element.onmousemove);  
  7.     } else  
  8.         element.attachEvent(eventName, eventHandler);  
  9. }  
  10.   
  11.   
  12. //安装鼠标移动、点击等方法  
  13. this.InstallEvents = function() {  
  14.     AddEvent(Canvas,"onmousemove",this.mousemove);  
  15.     AddEvent(Canvas,"onmousedown",this.mousedown);  
  16. };  

 

 

 

 

 

 

 

2.管理画图的命令(TComand)

建立绘图命令会在后续的章节进行介绍.

 

[javascript] view plaincopy
  1. this.getNewCommand = function(DisplayCanvas) {  
  2.         for (var i = 0; i < btnList.length; i++) {  
  3.             if (btnList[i].getGroup() == 1) {  
  4.                 if (btnList[i].getisChecked()) {  
  5.                     var commandId = btnList[i].Command();  
  6.                     var command = new TCommand(DisplayCanvas, commandId);  
  7.                     return command;  
  8.                 }  
  9.             }  
  10.   
  11.         }  
  12.         return null;  
  13.     };  

 

 

 

 

 

在线演示

 

工具条对象完整代码(TToolbar)

 

[javascript] view plaincopy
  1. function TToolbar(Canvas, x, y, width, height) {  
  2.     var Context = Canvas.getContext(‘2d‘);  
  3.     this.Canvas = Canvas;  
  4.     this.x = x;  
  5.     this.y = y;  
  6.     this.width = width;  
  7.     this.height = height;  
  8.     var CurrentShapeProperty;  
  9.     var BorderColor;  
  10.     btnList = new Array();  
  11.     btnCounter = 0;  
  12.     Create();  
  13.     // InstallEvents();  
  14.     function Create() {  
  15.   
  16.         Context.strokeStyle = "black";  
  17.         Context.lineWidth = "2";  
  18.         Context.strokeRect(x, y, width, height);  
  19.     }  
  20.   
  21.   
  22.     this.AddButton = function(button) {  
  23.         btnList[btnCounter++] = button;  
  24.     };  
  25.     function AddEvent(element, eventName, eventHandler) {  
  26.         window.alert( typeof element.addEventListener);  
  27.         if ( typeof element.addEventListener != "undefined") {  
  28.             window.alert(eventHandler);  
  29.             element.addEventListener(eventName, eventHandler, false);  
  30.             window.alert(element.onmousemove);  
  31.         } else  
  32.             element.attachEvent(eventName, eventHandler);  
  33.     }  
  34.   
  35.     mousemove = function(event) {  
  36.         var Current = null;  
  37.         for (var i = 0; i < btnList.length; i++) {  
  38.             if (btnList[i].testHit(event.clientX, event.clientY) == true)  
  39.                 Current = btnList[i];  
  40.         }  
  41.         if (Current != null) {  
  42.             for (var i = 0; i < btnList.length; i++) {  
  43.                     if ((btnList[i] != Current) && (btnList[i].getisChecked() == false))  
  44.                         btnList[i].setNormal();  
  45.             }  
  46.         }  
  47.     };  
  48.     mousedown = function(evnet) {  
  49.         var Current = null;  
  50.         for (var i = 0; i < btnList.length; i++) {  
  51.   
  52.             if (btnList[i].testMouseDown(event.clientX, event.clientY) == true)  
  53.                 Current = btnList[i];  
  54.         }  
  55.         if (Current != null) {  
  56.             for (var i = 0; i < btnList.length; i++) {  
  57.                 if (Current.getGroup() == btnList[i].getGroup()) {  
  58.                     if (btnList[i] != Current)  
  59.                         btnList[i].setNormal();  
  60.                 }  
  61.             }  
  62.             if (Current.getGroup()==3)  
  63.             {  
  64.               var Color=Current.Command();  
  65.               ColorSelected(Color);  
  66.              }  
  67.         }  
  68.           
  69.     };  
  70.   
  71.     //安装鼠标移动、点击等方法  
  72.     this.InstallEvents = function() {  
  73.         //AddEvent(Canvas,"onmousemove",this.mousemove);  
  74.         //AddEvent(Canvas,"onmousedown",this.mousedown);  
  75.         //Canvas.onmousemove=this.mousemove;  
  76.         Canvas.onmousemove = function(event) {  
  77.             mousemove(event);  
  78.         };  
  79.         Canvas.onmousedown = function(event) {  
  80.             mousedown(event);  
  81.         };  
  82.     };  
  83.     this.setBorderColorButton=function(ColorButton)  
  84.     {  
  85.         BorderColor=ColorButton;          
  86.     };  
  87.     function ColorSelected (color) {  
  88.        BorderColor.setColor(color);  
  89.     }   
  90.     this.getNewCommand = function(DisplayCanvas) {  
  91.         for (var i = 0; i < btnList.length; i++) {  
  92.             if (btnList[i].getGroup() == 1) {  
  93.                 if (btnList[i].getisChecked()) {  
  94.                     var commandId = btnList[i].Command();  
  95.                     var command = new TCommand(DisplayCanvas, commandId);  
  96.                     return command;  
  97.                 }  
  98.             }  
  99.   
  100.         }  
  101.         return null;  
  102.     };  
  103.     this.getShapeProperty = function() {  
  104.         if (typeof CurrentShapeProperty=="undefined")  
  105.         CurrentShapeProperty = new TShapeProperty();  
  106.         CurrentShapeProperty.setLineColor(BorderColor.Command());  
  107.         for (var i = 0; i < btnList.length; i++) {  
  108.             if (btnList[i].getGroup() == 2) {  
  109.                 if (btnList[i].getisChecked()) {  
  110.                     CurrentShapeProperty.setLineWidth(btnList[i].Command());   
  111.                 }  
  112.             }  
  113.         }  
  114.         return CurrentShapeProperty;  
  115.     };  
  116.       
  117. }  

 

 

 

 

 

图片按钮完整代码(TImageButton)

 

[javascript] view plaincopy
  1. function TImageButton(Command, NormalSrc, MouseOnSrc, MouseDownSrc, x, y, width, height, Toolbar, group) {  
  2.     var command = Command;  
  3.     var NormalSrc = NormalSrc;  
  4.     var MouseOnSrc = MouseOnSrc;  
  5.     var MouseDownSrc = MouseDownSrc;  
  6.     var x = x;  
  7.     var y = y;  
  8.     var width = width;  
  9.     var height = height;  
  10.     var Canvas = Toolbar.Canvas;  
  11.     var Context = Canvas.getContext("2d");  
  12.     var CSN = "Normal";  
  13.     var CSO = "MouseOn";  
  14.     var CSD = "MouseDown";  
  15.     var state = CSN;  
  16.     var Group = group;  
  17.     var image = new Image();  
  18.     CreateButton();  
  19.   
  20.     function CreateButton() {  
  21.   
  22.         LoadImage(NormalSrc);  
  23.     }  
  24.   
  25.     function Absx() {  
  26.         return Canvas.offsetLeft + Toolbar.x + x;  
  27.     };  
  28.     function Absy() {  
  29.   
  30.         return Canvas.offsetTop + Toolbar.y + y;  
  31.     };  
  32.     function PointIn(testx, testy) {  
  33.         if ((testx > Absx()) && (testx < (Absx() + width)) && (testy > Absy()) && (testy < (Absy() + height))) {  
  34.   
  35.             return true;  
  36.   
  37.         } else  
  38.             return false;  
  39.   
  40.     };  
  41.     function Clear() {  
  42.         Context.clearRect(Toolbar.x + x, Toolbar.y + y, width, height);  
  43.     }  
  44.   
  45.     function LoadImage(newsrc) {  
  46.   
  47.         image.src = newsrc;  
  48.   
  49.         if (image.complete) {  
  50.             RenderImage(image);  
  51.         } else  
  52.             image.onload = function() {  
  53.                 RenderImage(image);  
  54.             };  
  55.     }  
  56.   
  57.     function RenderImage(image) {  
  58.   
  59.         Context.drawImage(image, Toolbar.x + x, Toolbar.y + y, width, height);  
  60.     }  
  61.   
  62.     function ChangeState(NewState) {  
  63.   
  64.         state = NewState;  
  65.         Clear();  
  66.         if (NewState == CSN)  
  67.             LoadImage(NormalSrc);  
  68.         else if (NewState == CSO)  
  69.             LoadImage(MouseOnSrc);  
  70.         else if (NewState == CSD)  
  71.             LoadImage(MouseDownSrc);  
  72.     }  
  73.   
  74.   
  75.     this.testHit = function(dx, dy) {  
  76.   
  77.         if (PointIn(dx, dy)) {  
  78.   
  79.             if (state == CSN) {  
  80.                 ChangeState(CSO);  
  81.   
  82.             }  
  83.             return true;  
  84.         }  
  85.         return false;  
  86.   
  87.     };  
  88.     this.OnClick = function() {  
  89.     };  
  90.     this.testMouseDown = function(dx, dy) {  
  91.   
  92.         if (PointIn(dx, dy)) {  
  93.             ChangeState(CSD);  
  94.             this.OnClick();  
  95.             return true;  
  96.         }  
  97.         return false;  
  98.     };  
  99.     this.getisChecked = function() {  
  100.         return (state == CSD);  
  101.     };  
  102.     this.Command = function() {  
  103.         return command;  
  104.     };  
  105.     this.MoveOn = function() {  
  106.         return (state == CSO);  
  107.     };  
  108.     this.setNormal = function() {  
  109.         ChangeState(CSN);  
  110.     };  
  111.     this.getGroup = function() {  
  112.         return Group;  
  113.     };  
  114. }  

 

 

颜色选择框的完整代码(TColorButton)

 

[javascript] view plaincopy
  1. <span style="font-size:12px;">function TColorButton(Command,  
  2.                       x,  
  3.                       y,  
  4.                       width,  
  5.                       height,  
  6.                       Toolbar,  
  7.                       group)  
  8. {  
  9.     var command=Command;  
  10.     var x=x;  
  11.     var y=y;  
  12.     var width=width;  
  13.     var height=height;  
  14.     var Canvas=Toolbar.Canvas;  
  15.     var Context=Canvas.getContext("2d");  
  16.     var CSN="Normal";  
  17.     var CSO="MouseOn";  
  18.     var CSD="MouseDown";  
  19.     var state=CSN;  
  20.     var Group=group;  
  21.     CreateButton();  
  22.     function CreateButton()  
  23.     {  
  24.        RenderButton();  
  25.     }  
  26.     function Absx()   
  27.     {  
  28.        return Canvas.offsetLeft+Toolbar.x+x;  
  29.     };  
  30.     function Absy()   
  31.     {  
  32.          
  33.        return Canvas.offsetTop+Toolbar.y+y;  
  34.     };  
  35.     function PointIn (testx,testy)  
  36.     {  
  37.        if ((testx>Absx())&&(testx<(Absx()+width))  
  38.           &&(testy>Absy()) && (testy<(Absy()+height)))  
  39.          {  
  40.      
  41.               return true;  
  42.                 
  43.               }  
  44.           else  
  45.              return false;   
  46.                 
  47.     };   
  48.     function Clear()  
  49.     {  
  50.        Context.clearRect(Toolbar.x+ x,Toolbar.y+ y,width,height);  
  51.     }  
  52.     function RenderButton()  
  53.     {  
  54.          
  55.        Context.fillStyle=command;  
  56.        Context.fillRect(Toolbar.x+ x, Toolbar.y+ y,width,height);  
  57.        if (state==CSO)  
  58.        {  
  59.           Context.strokeStyle="#FFCC33";  
  60.           Context.lineWidth=2;  
  61.           Context.strokeRect(Toolbar.x+ x+2, Toolbar.y+ y+2,width-4,height-4);   
  62.        }  
  63.     }  
  64.     function ChangeState(NewState)  
  65.     {  
  66.          
  67.        state=NewState;  
  68.        Clear();  
  69.        RenderButton();    
  70.     }  
  71.     this.testHit=function(dx,dy)  
  72.     {  
  73.         
  74.        if (PointIn(dx,dy))  
  75.        {  
  76.    
  77.          if (state==CSN)  
  78.          {  
  79.             ChangeState(CSO);  
  80.   
  81.          }  
  82.          return true;  
  83.        }  
  84.        return false;  
  85.   
  86.     };  
  87.     this.testMouseDown=function(dx,dy)  
  88.     {  
  89.         
  90.        if (PointIn(dx,dy))  
  91.        {  
  92.             ChangeState(CSD);  
  93.             return true;  
  94.        }   
  95.        return false;  
  96.     };  
  97.     this.getisChecked=function()  
  98.     {  
  99.        return (state==CSD);  
  100.     };  
  101.     this.Command=function()  
  102.     {  
  103.        return command;  
  104.     };  
  105.     this.MoveOn=function()  
  106.     {  
  107.       return (state==CSO);  
  108.     };  
  109.     this.setNormal=function()  
  110.     {  
  111.        ChangeState(CSN);  
  112.     };  
  113.     this.getGroup=function()  
  114.     {  
  115.         return Group;  
  116.     };  
  117.     this.setColor=function(color)  
  118.     {  
  119.         command=color;  
  120.         Context.fillStyle=command;  
  121.         Context.fillRect(Toolbar.x+ x, Toolbar.y+ y,width,height);  
  122.     };  
  123.       
  124. }   

HTML5 canvas 在线画笔绘图工具(二)

标签:

原文地址:http://www.cnblogs.com/gongzt/p/Online_drawing_toolbar.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!