Canvas画板

一、实现思路

  1. (非触屏设备) 监听鼠标事件
    ①按下鼠标:onmousedown;滑动鼠标:onmousemove;松开鼠标:onmouseup:
    ②按下鼠标时,获取鼠标的x、y坐标(通过clientX、clientY获取);
    滑动鼠标时,也要先获取鼠标的x、y坐标,把滑动获取的值作为新点,再通过把新点坐标赋值给旧点坐标,鼠标滑动的同时也就连成了线;
    松开鼠标时,更改画画的状态,继而引出下一个问题。
  2. 状态转换
  • 触发事件前,一定要先判断当前状态。比如:我要开始画画,此时就把状态切换到画画状态(通过painting = true来切换状态),画完了再切换到非画画状态(painting = false);
  • 橡皮擦只有在受到点击时才会开启使用状态,所以在click事件中切换状态;因为滑动事件有可能是在使用橡皮擦,也有可能是在使用画笔,所以要先根据橡皮擦的使用状态来判断要使用橡皮擦还是画笔;
  • 操作在哪个事件中使用就在哪个事件中控制状态,比如:画笔是发生在onmouse事件中,所以在onmouse事件控制状态;橡皮擦是发生在按钮onclick事件中,所以在onclick事件控制状态。
  1. 画图就用<canvas></canvas>
//HTML
<canvas id="xxx"></canvas>
//JS
var yyy = document.getElementById('xxx')
var context = yyy.getContext('2d')
//以下引用基于这里

①HTML5<canvas></canvas>标签用来通过JS绘制图像,<canvas>元素本身并没有绘制能力(它仅仅是图形的容器),需要使用脚本来完成绘图任务;
②它是inline-block元素
③通过<canvas>元素的getContext('2d')方法所返回的对象属性和方法,可用于在画布上绘制线条、矩形、圆形、文本等;一定分清哪些是属性,哪些是方法;
④还有一点需要注意的是,<canvas>的宽高不要直接设置在CSS中,要在JS中通过获取设备屏幕的宽高赋值给<canvas>的宽高;

var pageWidth = document.documentElement.clientWidth
var pageHeight = document.documentElement.clientHeight
//JS中获取页面的宽高,不止这一种方法,但这种最好记
var x = aaa.clientX
var y = aaa.clientY//表示相对于视窗口x轴、y轴的坐标长度

⑤一定要先上颜色,再绘制
content.fillstyle = 'red' //填充颜色

//绘制圆形
context.beginPath()
context.arc(x, y, radius, 0, Math.PI * 2) //表示以(x,y)为圆心,radius为半径,从0度开始,画到Math.PI * 2
context.fill()
//绘制线条
  context.fillstyle = 'red' //如果上面有颜色填充,那这里可以不写
  context.beginPath() //开始画
  context.lineWidth = 5 //设置线条粗细
  context.moveTo(x1, y1) //选一点开始画
  context.lineTo(x2, y2) //画到这一点
  context.stroke() //绘制已定义的路径
  context.closePath() // 闭合路径,也就是创建路径

⑥常用API

  • fill():填充当前绘图路径;
    stroke():绘制已定义的路径;画线条就会这个;
  • 填充颜色
    ctx.fillStyle = 'red'
    ctx.strokeStyle = 'red'
  • 清除图形
    ctx.clearRect(x,y,width,height):以矩形的形状来清空;(橡皮擦和清除画布功能都能用此API来实现)
    更多属性及方法参考MDN
  1. (触屏设备)监听ontouch事件
    ontouchstart:开始触摸;
    ontouchmove:触摸滑动;
    ontouchend:结束触摸;
  2. 如何检测是否是触屏设备呢?
    特性检测,检测是否支持ontouch特性(而不是去检测设备)
if(document.body.ontouchstart !== undefined){
//说明支持ontouch属性,是触屏设备
}else{}

浏览器中在手机模式下的控制台中输入document.body.ontouchstart,回车,如果返回null,说明有这个特性,只是没有赋值;返回undefined,说明没有这个特性,未定义这个特性。

  1. Canvas 保存到本地
    ①利用Canvas的API:ctx.toDataURL(type,encoderOptions)(参数可选),它返回一个包含图片展示的data URL;
    ②创建生成<a>标签,把它append到body中,使其href属性为ctx.toDataURL(type,encoderOptions)a.download = 'picture'(download 属性定义了下载链接的地址,也可以定义为下载文件的名称),最后点击<a>标签(a.click()),即完成下载。

二、代码知识

  1. CSS—transform属性
    ①对元素应用2D、3D转换,进行移动(translate(x,y)、translate3D(x,y,z)、translateX(x)......)、缩放(scale(x,y)、scaleX(x)......)、旋转(rotate(angle)定义2D旋转......)、倾斜(skew(x-angle,y-angle));
    ②负值代表向相反方向;
  2. @keyframes、animationtranaform配合使用
    通过 @keyframes 规则,能够创建动画,创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式,以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%,0% 是动画的开始时间,100% 动画的结束时间。
//html
 <img src="..." alt="..." id = "musicIcon" title="...">
//CSS
img{
     animation: aaa 1s infinite;
}
@keyframes aaa{
    0%{transform:rotate(-10deg);}
    50%{transform:rotate(10deg);}
    100%{transform:rotate(-10deg);}
}

animation 属性是一个简写属性,它包括animation-name,animation-duration,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,不过一般只需要设置名字、间隔和循环次数即可

  1. CSS—transition属性
    ①它定义了从一种样式过渡到另一种样式的方式,包括过渡的css属性名(transition-property),过渡时间(transition-duration),时间曲线(transition-timing-function),从何时开始(transition-delay),这些属性可直接简写到transition中,各个属性值间留有空格;多个CSS过渡属性可写在一起,中间用隔开。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容