基于HTML5 画布功能canvas的绘画板:画线、画圆、画矩形、橡皮、改变线条

/*background-color: transparent */

}

#div1

{

width: 800px;

height: 600px;

position: relative;

border: 1px solid black;

}

#div2

{

width: 800px;

height: 36px;

border: 1px solid black;

background-color:rgb(220,230,244) ;

}

ul

{

background-color: rgb(220,230,244);

text-align: center;

margin: 0;

padding: 0;

height: 30px;

float: left;

margin-left: 14px;

margin-right: 14px;

}

ul>li

{

float: left;

border: 1px solid gainsboro;

width: 40px;

line-height: 25px;

display: inline-block;

height: inherit;

}

button

{

padding: 0px;

}

.red

{

background-color: red;

}

.black

{

background-color: black;

}

.white

{

background-color: white;

}

.blue

{

background-color: blue;

}

.yellow

{

background-color: yellow;

}

.choice

{

border: 3px solid gold;

}

3.JS

说一下我的实现思路,定义三个变量 style、mywidth、mycolor分别代表工具类型、粗细和颜色。所以首先写的是ul下li的点击事件,并且给每一个点击的li添加一个choice类(有一个黑色的粗边框),用来表示其被选状态;

以下点击事件的代码:

var style = 0;

var mycolor = “black”;

var mywidth = 2.5;

$(function(){

//添加选中样式

$(“li”).click(function(){

$(“.cleardraw”).removeClass(“choice”);

//如果点的是那几个小标题是没有反应的

if ($(this).prop(“className”) == “firstli”) {

} else{

//先把父元素下的其他元素的选中状态移除。

$(this).parent().children().removeClass(“choice”);

$(this).addClass(“choice”);

}

})

$(“.small”).click(function(){

mywidth = 1;

})

$(“.normol”).click(function(){

mywidth = 2.5;

})

$(“.big”).click(function(){

mywidth = 5;

})

$(“#qianbi”).click(function(){

style=0;

})

$(“#juxing”).click(function(){

style=1;

})

$(“#yuanxing”).click(function(){

style=2;

})

$(“#xiangpi”).click(function(){

style=3;

})

$(“.red”).click(function(){

mycolor = “red”;

})

$(“.black”).click(function(){

mycolor = “black”;

})

$(“.white”).click(function(){

mycolor = “white”;

})

$(“.yellow”).click(function(){

mycolor = “yellow”;

})

$(“.blue”).click(function(){

mycolor = “blue”;

})

$(“.cleardraw”).click(function(){

ctx.clearRect(0,0,800,600);

})

})

这样就把click事件基本上写完了,下面来实现绘画功能,主要涉及到mousedown mousemove mouseup 三个事件

说一下我的思路,鼠标点下的时候触发mousedown函数,switch一下style,判断是铅笔还是橡皮,还是矩形或者圆~

先说铅笔,记录一下mousedown的坐标beginx和beginy,每一次鼠标move的时候,取一下这时候的event.pageX和event.pageY变量,然后在这两点之间画出线,并且修改下一次mousemove画线的起点应该是上一次的终点。也就是说,每次移动的之后都要beginx =event.pageX,beginy =event.pageY

注意:mousemove事件并不会随着你的鼠标抬起而clear,即使你把他写在了mousedown事件下,所以我用了一个lock,点击的时候lock = true 打开,mouseup的时候,lock = false锁上。后来发现更简单的方法,就是用 bind和unbind方法!

$(“#div1”).mousedown(function(event){

beginx =event.pageX;

beginy =event.pageY;

console.log(“我点下来的时候:”,beginx,beginy);

switch(style)

{

//铅笔状态

case 0:

console.log(“我选的是铅笔”);

lock0 = true;

//console.log(“我点下来的时候:”,beginx,beginy);

$(“#div1”).bind(‘mousemove’,function(event){

if(lock0)

{

ctx.beginPath();

ctx.moveTo(beginx,beginy);

ctx.lineTo(event.pageX,event.pageY);

ctx.strokeStyle = mycolor;

ctx.lineWidth = mywidth;

ctx.stroke();

beginx =event.pageX;

beginy =event.pageY;

}

})

break;

}

}

})

橡皮的思路和铅笔一样,只不过要把颜色设置成白色固定!

case 3:

console.log(“我选的是橡皮”);

lock3 = true;

//console.log(“我点下来的时候:”,beginx,beginy);

$(“#div1”).bind(‘mousemove’,function(event){

if(lock3)

{

ctx.beginPath();

ctx.moveTo(beginx,beginy);

ctx.lineTo(event.pageX,event.pageY);

ctx.strokeStyle = “white”;

ctx.lineWidth = mywidth*3;

ctx.stroke();

beginx =event.pageX;

beginy =event.pageY;

}

})

break;

然后是画矩形,这时候就用到了声明的第二个画布,我们可以把它看做成一个缓冲区,在mousemove下鼠标每次移动,先清空这个缓冲区,然后画到缓冲区里面一个矩形。mouseup的时候,也清空以下缓冲区,然后在第一张画布里根据位置声明一个一样的矩形。

代码如下:

case 1:

lock1 = true;

console.log(“画个矩形吧!”);

$(“#div1”).bind(‘mousemove’,function(event){

if(lock1)

{

ctx2.clearRect(0,0,800,600);

xx=event.pageX-beginx;

yy=event.pageY-beginy;

ctx2.beginPath();

ctx2.rect(beginx,beginy,xx,yy);

ctx2.strokeStyle = mycolor;

ctx2.lineWidth = mywidth;

ctx2.stroke();

}

})

break;

画圆的话,和画矩形局相似了,我就不赘述了。

下面是画圆的代码:

case 2 :

lock2=true;

console.log(“画个圆吧 !”)

$(“#div1”).bind(‘mousemove’,function(event){

if(lock2)

{

ctx2.clearRect(0,0,800,600);

xx=event.pageX-beginx;

yy=event.pageY-beginy;

r = Math.sqrt(xxxx+yyyy)/2;

centerx = (event.pageX+beginx)/2;

centery = (event.pageY+beginy)/2;

console.log(xx,yy,centerx,centery,r);

ctx2.beginPath();

ctx2.arc(centerx,centery,r,0,2*Math.PI,true);

ctx2.strokeStyle = mycolor;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-p44p9Hlg-1715152824726)]

[外链图片转存中…(img-sp3ed8X9-1715152824726)]

[外链图片转存中…(img-0D9OybrW-1715152824726)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值