All Projects → curtainTan → drawing-board

curtainTan / drawing-board

Licence: other
canvas-drawing-board

Programming Languages

javascript
184084 projects - #8 most used programming language
CSS
56736 projects
HTML
75241 projects

Projects that are alternatives of or similar to drawing-board

Wxinlineplayer
🤟Super fast H.264/H.265 FLV player
Stars: ✭ 873 (+3695.65%)
Mutual labels:  canvas, h5
snake-game-p5
The Snake Game made with p5.js 🐍🎮.
Stars: ✭ 18 (-21.74%)
Mutual labels:  canvas, canvas-game
awesome-canvas
Canvas资源库大全中文版。An awesome Canvas packages and resources.
Stars: ✭ 288 (+1152.17%)
Mutual labels:  canvas, canvas-game
Hqchart
HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据替换接口
Stars: ✭ 1,126 (+4795.65%)
Mutual labels:  canvas, h5
flappy-bird
🐦 A clone of a famous game, the Flappy Bird, made in Javascript and HTML Canvas API.
Stars: ✭ 37 (+60.87%)
Mutual labels:  canvas, canvas-game
Drawingboard.js
A canvas based drawing app that you can integrate easily on your website.
Stars: ✭ 2,072 (+8908.7%)
Mutual labels:  canvas, drawingboard
Fundcharts
轻量级canvas数据可视化组件库(可在web移动端、微信小程序、服务端nodejs运行)。包含折线图/面积图、饼图/环形图、柱状图、雷达图(蜘蛛图),散点图,K线图,组合图,持续更新及维护。
Stars: ✭ 143 (+521.74%)
Mutual labels:  canvas, mobile-web
editor-ovo
A rich text editor for mobile web. Mixed editing of photos and Emoji 一个适用于移动web的富文本编辑器。照片加emoji的混合编辑
Stars: ✭ 29 (+26.09%)
Mutual labels:  mobile-web, h5
shmup.re
Learning Reason/OCaml by making an old-school canvas game.
Stars: ✭ 24 (+4.35%)
Mutual labels:  canvas-game
radiaSlider
circular/linear knob-style slider
Stars: ✭ 18 (-21.74%)
Mutual labels:  canvas
servonk
Servo on Gonk
Stars: ✭ 84 (+265.22%)
Mutual labels:  mobile-web
Front-End-Study
学习、总结、提升
Stars: ✭ 13 (-43.48%)
Mutual labels:  h5
shoot game
🎮 It is a game using HTML5 Canvas and Vanilla JavaScript.
Stars: ✭ 35 (+52.17%)
Mutual labels:  canvas
Anondraw
Source code of anondraw.com. An artistic collaboration tool with an infinite canvas.
Stars: ✭ 43 (+86.96%)
Mutual labels:  drawingboard
canvas-merge-video-in-vue
canvas+vue 实现视频碎片合并 比较粗陋,欢迎fork 升级++
Stars: ✭ 21 (-8.7%)
Mutual labels:  canvas
endless-runner-3d
Cube Endless Runner is a 3D game built with BabylonJS engine on top of WebGL and HTML5 technologies
Stars: ✭ 29 (+26.09%)
Mutual labels:  canvas-game
canvas2video
canvas2video is a backend solution for creating and rendering dynamic videos.
Stars: ✭ 194 (+743.48%)
Mutual labels:  canvas
imitate-beautiful-thing
使用vue 做的一个h5 app。Using Vue to imitate a app.
Stars: ✭ 56 (+143.48%)
Mutual labels:  h5
fabricjs-image-editor-origin
fabric.js javascript image editor
Stars: ✭ 52 (+126.09%)
Mutual labels:  canvas
NightSky
A way to avoid paying 50 bucks by using some js to generate an image of the night sky at specific time and location. 🌑
Stars: ✭ 49 (+113.04%)
Mutual labels:  canvas

快到碗里来-画板


预览:点击

前言:


之前学完canvas,一直想自己写一点东西,这两天终于完成了,开心!!

完成功能:


  1. 绘画
  2. 画直线
  3. 截图
  4. 旋转
  5. 弹幕
  6. 鼠标触碰弹幕,弹幕悬停
  7. 撤销/前进
  8. 设置画笔信息
  9. 兼容移动端

功能截图:


前置说明


如果你需要参考代码,你需要看下这里。
因为功能复杂,标志的变量有接近10个之多,一下子可能很难看懂,所以我这里说明下我的开发流程,以及定义变量的顺序。
  1. 功能顺序:

画笔 → 定义画笔信息 → 橡皮檫 → 删除 → 撤销/前进 → 直线 → 截图 → 弹幕

  1. 定义变量的顺序,以及作用:

所有功能变量:

var isDown = false                  // 标志鼠标是否按下      绘图三步和剪切三步走时,后面两个事件触发的标志
var points = []                     // 滑动时收集的点       绘画三步走时,为了时画的线光滑,记录点,减短画线的距离
var beginPoint = null               // 开始的点            绘画三步走时使用

----这三个为一组,画线三人组,为了让画的线更为光滑

var currentMenu = "icon-pen"        // 初始按钮            底部按钮选中的按钮
var currentColor = 0                // 初始颜色的index     颜色选择,默认第一个
var paintingModal = "pen"           // 画笔模式   line||pen||cut

----按钮功能三人组,按钮选中标记,颜色选中,画画的模式,切换前面画笔和画直线的模式

var lookModal = false               // 鼠标模式             按钮第一个功能,此模式不能绘画,只能看
var cuted = false                   // 标记裁剪时,是否已经裁剪       裁剪后,防止后续的操作再次触发裁剪操作 

----鼠标模式和剪切模式的定义

var animationTimer = null           // 弹幕动画的timer               动画的timer
var barrageArray = []               // 保存弹幕的数组
var globalPoint = { x : 0, y : 0 }  // canvas上鼠标的点        ---弹幕时使用

----弹幕三人组  globalPoint用来标记鼠标在canvas中的坐标,用于判断鼠标是否触碰到弹幕上

// 实现撤销和重做的功能
let canvasHistory = []                    // canvas数据,在每次画线和橡皮檫使用后保存数据
let step = 0                              // 画笔抬起的步数,清空时,步数也清空

----撤销/前进二人组,画笔抬起时,把画布信息用getImageData存入canvasHistory,用step完成前进和撤销的功能

var penAttibutes = {                       // 画笔数据,
    width : 2,
    lineCap : "round",
    lineJoin : "round",
    strokeStyle: "#000",
    fillStyle: "#000",
    globalCompositeOperation: "source-over",
    globalAlpha : 1
}

开发中遇到的难点与重点与解决方案:


  1. 保存历史记录使用api对比

    我在写代码的时候有做过参考 这篇文章, 文章里用是canvas.toDataUrl的方式做的数据保存,评论里说这个数据保存不理想, 其实我一开始的时候想的就是用ctx.getImageDaata的方式来做的,我也用这个两个api做了一个对比:

代码:

结果:

可见,使用getImageData获取数据是时间是非常短的,并且获取到是画布像素数据,
后续可以直接进行像素操作,从而不用再花时间再去获取画布信息,
其次,getImageData获取到是数据是有数据结构的,这样在内存里面保存下来对内存更加友好,
而使用toDataUrl方式保存下来的数据有21万行那么长的字符串,对内存并不友好。

后面我还做了他们绘制到画布上的时间对比,他们的时间都在1ms内,到时每次putImageData都要快一点点,但是快这一点时间的意义并不大。

toDataUrl也是有好处的,因为转置出来的是base64的字符串,所以他能够直接作为图片的src属性,让图片显示到页面。
  1. 画直线

    如何画出一条直线??当我做了撤销和前进的时候,我就把画板数据给存到canvasHistory里面了, 这里刚好用到,鼠标移动是时候,先清空画布,再绘制保存到canvasHistory里最后那个数据,然后就是绘图三步走,就完成了。

    **注意:**这里一定要绘图三步走,或者在绘制前一定要用beginPath()重开一条路径,如果不重开路径, 绘制时,会把前面的直线一同绘制出来,因为你一直是一条路径,所以下次绘制时,上次的点也要绘制一遍。

  2. 图片旋转

    旋转很类似css3,但是,canvas的基点固定在左上角处,所以在旋转的时候,需要先用translate移动画板,可以画一下图,

下面是我画的图:

问题: 当我画笔有rotate属性的时候,当前操作的putImageData不会成功,不知道为什么-----
  1. 如何画出一条光滑的曲线

    用正常的画法画曲线是时候,画出的曲线不够光滑, 所以我就参考了这篇文章 canvas进阶——如何画出平滑的曲线? (其实我也想到了用二次贝塞尔曲线,在寻找更好的解决方案时,就找到这个方法了,这个方案更优),原理可以看原文。

  2. 鼠标触摸弹幕

    因为canvas是无记忆性的,所以,你用isPointPath和isPointStroke时,是在当前绘画下才能检测。 在使用isPointPath时,他只与path路径有关,意思就是,你用fillRect直接绘制一个矩形图形是不能检测的, 只能检测rect()和pathTo等围起来的路径内。

    所以,这里我做了一个外挂路径-用rect()把每个弹幕框起来------哈哈--

  3. 使用drawImage须知:

    drawImage有三种传参方式,三种方式出来的效果,在书写前可以先参考效果。

参考地址:CanvasRenderingContext2D.drawImage

  1. 兼容移动端

    当在移动端时,会存在移动端延时300ms的问题,因为移动端有双击放大功能,故存在300ms时间。

    我解决的方法是设置meta信息,禁止缩放,就可以防止300ms问题

结语:


这个项目大概用了canvas的75%的api,还有像素操作和渐变等api还没用到。

不知道有没有人看呢,

如果你看到了这篇文章,希望对你有帮助。

慢慢来,好好学习,要加油哦!

与君共勉!!

参考材料:

参考了楼主项目的样式,但是所有样式都是我自己写的,嘻嘻,实现方式不一样哦。。

画一条光滑的曲线,不错哦。

可以在这里把所有api的意义和作用和参数等都记下来-----

canvas所有的api,当然你也可以去mdn看,其实都一样啦---

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].