canvas涂鸦板

canvas涂鸦板

功能说明

此画板兼容PC端和移动端,是使用HTML5开发的一款画图软件,用户可以在画板中随意涂鸦,然后保存成图片

技术说明:

  1. 利用canvas的画图功能
  2. html5在pc端和移动端浏览器中的事件差异

开发步骤

html代码

<!DOCTYPE html>
<html><head>
<title>涂鸦板</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>-->
<style type="text/css">
#myCanvas {border: 1px solid black;
}
</style>
</head><body>
<!--注意,设置canvas宽、高时不要加上单位,如px-->
<canvas id="myCanvas" width="300" height="300"></canvas>
<div><button onclick="clean();">清 空</button><button onclick="save();">生成图片</button>
</div>
<img id='img' />
</body>
<script type="text/javascript" src="js/canvas.js"></script></html>

代码说明:

  1. 一个canvas元素,用于画图,通过css设置其边框
  2. 两个按钮,一个用户生成图片,一个用于清空涂鸦板
  3. 一个img元素,用来显示生成的涂鸦图片

下面我们来说js代码

相关知识

首先我们要实现在pc端和移动端都能够绘制图形,这意味着我们既要响应鼠标的事件,又要响应触摸事件

不用怀疑,在手机端浏览器中,onmousedown无法对你按下手指的动作做出响应,我们必须使用与之相对应的触摸事件才可以

下面介绍一下我们用到的事件

事件名称何时触发事件名称何时触发
onmousedown鼠标按下时touchstart手指触摸屏幕时
onmousemove鼠标移动时touchmove手指在屏幕上滑动时
onmouseup鼠标松开时touchend手指从屏幕离开时

onmousedown与touchstart对应

onmousemove与touchmove对应

onmouseup与touchend对应

前者为PC端事件,后者为移动端(如手机)事件

下面我们开始编码

获取元素、声明变量

    var canvas, board, img;//获取canvascanvas = document.getElementById('myCanvas');//获取img,当用户点击“生成图片”时,会将用户的涂鸦生成图片并显示到这个img中img = document.getElementById('img');//获取绘图上下文,将来就是用这个上下文在画板上绘制图形board = canvas.getContext('2d');//声明变量,表示鼠标的按下状态,false表示未按下,true表示按下var mousePress = false;var last = null;

注册事件

    //为鼠标按下事件指定要执行的函数canvas.onmousedown = beginDraw;//为鼠标移动事件指定要执行的函数canvas.onmousemove = drawing;//为鼠标松开事件指定要执行的函数canvas.onmouseup = endDraw;//为canvas添加touchstart事件,当手指在触摸屏设备(如手机)中按下时触发canvas.addEventListener('touchstart', beginDraw, false);//为canvas添加touchmove事件,当手指在触摸屏设备(如手机)中按下并移动时触发canvas.addEventListener('touchmove', drawing, false);//为canvas添加touchend事件,当手指在触摸屏设备(如手机)中离开时触发canvas.addEventListener('touchend', endDraw, false);

beginDraw函数

    function beginDraw(event) {             mousePress = true;}

代码说明:

onmousedown和touchstart事件都会执行这个函数,此函数将变量mousePress的值设置为true,表示用户已经按下了鼠标或者用户按下了手指,这个变量我们后面使用

drawing函数

    function drawing(event) {event.preventDefault();if (!mousePress) return;var xy = pos(event);if (last != null) {board.beginPath();board.moveTo(last.x, last.y);board.lineTo(xy.x, xy.y);board.stroke();}last = xy;}function pos(event) {var x, y;if (isTouch(event)) {x = event.touches[0].pageX;y = event.touches[0].pageY;} else {x = event.offsetX + event.target.offsetLeft;y = event.offsetY + event.target.offsetTop;}// log('x='+x+' y='+y);return {x: x,y: y};}

代码说明:

onmouseover和touchmove事件都会执行这个函数,也就说用户用鼠标在canvas上滑动和用手指在屏幕上滑动时都会触发这个事件。

event.preventDefault():的作用是禁用浏览器的默认事件,而只执行我们自己编写的代码,因为有的浏览器当你在上面滑动时可能会执行浏览器自己的事件,比如刷新页面等。

if (!mousePress) return:如果此变量的值为false,则不执行后面的代码,即如果用户没有按下鼠标或者触摸屏幕就不会执行画图的操作

var xy = pos(event):调用pos函数,此函数的作用是返回鼠标当前的坐标,或者手指当前的坐标,返回值的格式为{x:x,y:y},我们使用canvas画图需要用到坐标。关于pos函数,我们稍后详细解释

if (last != null):如果last的值不为null,就开始执行画图代码

    {board.beginPath();board.moveTo(last.x, last.y);board.lineTo(xy.x, xy.y);board.stroke();}

因为last的初始值为null,所以第一次的判断不会成立,就不会执行上面的画图代码,而是执行下面的last = xy;但是mousemove和touchmove事件在你移动的过程中会一直执行,所以下次的判断就成立了,进而执行画图代码。代码的具体含义请自己学习canvas的使用,非常简单

pos函数

    function pos(event) {var x, y;if (isTouch(event)) {x = event.touches[0].pageX;y = event.touches[0].pageY;} else {x = event.offsetX + event.target.offsetLeft;y = event.offsetY + event.target.offsetTop;}// log('x='+x+' y='+y);return {x: x,y: y};
}

代码说明

此函数的作用是获取鼠标点击或者手指触摸的坐标位置

isTouch(event):因为在移动端和PC端获取操作位置的方法不一样,所以使用此方法判断触发当前操作的是鼠标事件还是触摸事件,注意其参数是pos函数的参数,而pos函数的参数event又是其调用者drawing函数传递的,isTouch函数我们稍后会做讲解

理解了这个方法,后面的代码就简单了:根据不同的触发者,分别使用不同的方法获取当前的坐标位置,然后拼接成json格式数据{x:x,y:y}并返回给pos函数的调用者drawing函数

isTouch函数

function isTouch(event) {
var type = event.type;
if (type.indexOf('touch') >= 0) {return true;
} else {return false;
}
}

代码说明

var type = event.type:event.type属性返回的是触发当前操作的是鼠标事件(onmousemove)还是触屏事件(touchmove),我们可以将其输出看一下结果

PC端

鼠标事件

移动端

触屏事件

后面的代码就简单了,我们已经看到了event.type的值了,为mousemove或者touchmove,下面的代码就是判断如果type值中包含touch关键字,就返回true,否则返回false。然后pos函数再根据这个返回值执行不同的代码获取鼠标或者手指当前的位置

endDraw函数

function endDraw(event) {
mousePress = false;
event.preventDefault();
last = null;

}

代码解释

当执行onmouseup或者touchend事件时执行这些代码,也就是说当用户松开鼠标或者手指离开触摸屏的时候会执行这些代码

此函数将mousePress变量设置为false,这样再次执行drawing函数时,因为条件不满足(if (!mousePress) return;),就不会执行画图代码了,直到下次用户按下鼠标或者按下手指才会执行

last = null的作用是清空当前存储的坐标值

OK,到这里其实就已经实现画图了,下面的函数用于将用户的涂鸦生成图片

save函数

function save() {    
var dataUrl = canvas.toDataURL();
img.src = dataUrl;

}

代码解释

canvas.toDataURL():返回一张使用canvas绘制的图片

img.src = dataUrl:将生成的图片显示到页面上

clean函数

function clean() {
board.clearRect(0, 0, canvas.width, canvas.height);
}

代码解释

这行代码的作用是清除canvas画布上的内容

完整代码

html代码
<!DOCTYPE html>
<html><head>
<title>涂鸦板</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <script type="text/javascript"
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>-->
<style type="text/css">
#myCanvas {border: 1px solid black;
}
</style>
</head><body>
<!--注意,设置canvas宽、高时不要加上单位,如px-->
<canvas id="myCanvas" width="300" height="300"></canvas>
<div><button onclick="clean();">清 空</button><button onclick="save();">生成图片</button>
</div>
<img id='img' />
</body>
<script type="text/javascript" src="js/canvas.js"></script></html>

js代码

var canvas, board, img;
//获取canvas
canvas = document.getElementById('myCanvas');
//获取img,当用户点击“生成图片”时,会将用户的涂鸦生成图片并显示到这个img中
img = document.getElementById('img');
//获取绘图上下文,将来就是用这个上下文在画板上绘制图形
board = canvas.getContext('2d');
//设置画笔宽度和颜色
board.lineWidth = 1;
board.strokeStyle = "#0000ff";
//声明变量,表示鼠标的按下状态,false表示未按下,true表示按下
var mousePress = false;
var last = null;function beginDraw(event) {mousePress = true;
}function drawing(event) {
event.preventDefault();
if (!mousePress) return;
var xy = pos(event);
if (last != null) {board.beginPath();board.moveTo(last.x, last.y);board.lineTo(xy.x, xy.y);board.stroke();
}
last = xy;}function endDraw(event) {mousePress = false;event.preventDefault();last = null;
}function pos(event) {var x, y;if (isTouch(event)) {x = event.touches[0].pageX;y = event.touches[0].pageY;} else {x = event.offsetX + event.target.offsetLeft;y = event.offsetY + event.target.offsetTop;
}   
return {x: x,y: y
};
}function log(msg) {var log = document.getElementById('log');var val = log.value;log.value = msg + 'n' + val;
}function isTouch(event) {var type = event.type;//alert(type);if (type.indexOf('touch') >= 0) {return true;} else {return false;}
}function save() { //返回一张使用canvas绘制的图片   var dataUrl = canvas.toDataURL();    img.src = dataUrl;
}function clean() {board.clearRect(0, 0, canvas.width, canvas.height);
}//为鼠标按下事件指定要执行的函数
canvas.onmousedown = beginDraw;
//为鼠标移动事件指定要执行的函数
canvas.onmousemove = drawing;
//为鼠标松开事件指定要执行的函数
canvas.onmouseup = endDraw;
//为canvas添加touchstart事件,当手指在触摸屏设备(如手机)中按下时触发
canvas.addEventListener('touchstart', beginDraw, false);
//为canvas添加touchmove事件,当手指在触摸屏设备(如手机)中按下并移动时触发
canvas.addEventListener('touchmove', drawing, false);
//为canvas添加touchend事件,当手指在触摸屏设备(如手机)中离开时触发
canvas.addEventListener('touchend', endDraw, false);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353766.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

给文字做涂鸦效果的五种实现方案

介绍 在很多创意网站上&#xff0c;我们都会见到很多文字涂鸦效果&#xff0c;本期我们就介绍五种方法来实现这些文字涂鸦效果&#xff0c;康康如何通过前端技术&#xff0c;一起来让你的网页更有创意吧。 当然在做之前&#xff0c;我们先准备一张涂鸦纹理图哟~ 正文 backgr…

涂鸦音乐

在声音处理技术里有一种常用方法就是将声音信号转化成频谱图。比如下面这幅图&#xff0c;就是由一段小提琴演奏转化而来的。 有人会问&#xff0c;转成频谱图后又怎样呢&#xff1f;我不想谈接下来技术上可以做的各种分析&#xff0c;只从人感知信息的方式这个角度来说。 频谱…

c++小游戏制作02:涂鸦跳跳

先看效果图: 首先需要先下载安装SFML安装包,这里我下载的是64位的 然后解压放在一个文件夹下,记好路径 然后要在VS中加入路径 在VC++目录中配置包含目录和库目录 包含目录的路径:D:\SFML-2.5.1\include 库目录的路径:D:\SFML-2.5.1\lib 然后在链接器-输入-添加依赖项中…

涂鸦

在熟悉painter这个软件&#xff0c;开始胡乱的涂鸦&#xff0c;笔触虽多&#xff0c;不过要搞懂怎么用还真不是件简单的事。

【unity】分享一个2D小游戏的完整制作教程——涂鸦跳跃demo

文章目录 前言1.贴图准备跳板的逻辑人物的逻辑相机的逻辑如何自动生成跳板如何赢得游戏 前言 这个只是练手的一个2D小游戏&#xff0c;不许商用哦完成了原版的一个关卡的内容&#xff0c;跳板也只有一种&#xff0c;但是如果需要的话可以往深了做的项目地址Demo试玩&#xff0…

vb鼠标涂鸦板的制作

实验要求 掌握使用Picture1_MouseDown语句/Picture1_MouseUp&#xff0c;Picture1_MouseMove语句和Command Dialog的实现方法。实现鼠标画图程序。编写实验报告。 效果 清除画布的代码&#xff08;本实验没添加这个功能&#xff0c;留着备用&#xff09; Privte Sub Command…

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能&#xff1a; l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色&#xff0c;实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯&#xff0c;连接服务器长亮&#xff0c;断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能…

Arduino+涂鸦云,教你制作幻彩灯带

大家好&#xff0c;我是程序员小哈。前一阵参加了涂鸦智能【幻彩灯带】Arduino开发实战训练营&#xff0c;参与完整个过程&#xff0c;收获颇丰&#xff0c;今天对本次制作的幻彩灯带进行一下小结&#xff0c;希望以后可以再次参与其他内容的训练营活动。 概况 本次DIY内容为基…

Unity实现在白板上绘画涂鸦

前言 有段时间没有更新博客了&#xff0c;不知道应该写些什么&#xff0c;太简单感觉没有记录的必要&#xff0c;太难自己都没能理解&#xff0c;不知道如何下手。回归初心&#xff0c;记录自己想记录的东西。 需要实现一个白板绘画的功能&#xff0c;可以使用LineRenderer或者…

手机怎么使用涂鸦?分享几个手机视频怎么添加涂鸦的妙招

相信大家在给视频进行处理时&#xff0c;都会运用一些视频剪辑工具来给视频增添一些涂鸦等效果&#xff0c;比如把云朵涂鸦成独角兽或者与其相似的图案&#xff0c;让那些观看我们视频的人在视觉上增加了些许乐趣&#xff0c;不会显得视频画面太过于枯燥乏味。 那你们知道这些…

使用Fabric.js库制作一个绘画网站,实现绘画板涂鸦功能

1.学习之前 这个功能是基于vue的&#xff0c;如果你没有学过vue&#xff0c;可能对里面的知识不理解&#xff0c;对于canvas要有一点点的理解&#xff0c;如果没有&#xff0c;建议学习一下 如果实在需要关于Fabricjs写的绘画功能&#xff0c;可以看一下我参考其他人写的文档&a…

视频涂鸦怎么弄?视频涂鸦用什么软件?

随着时代的发展&#xff0c;大众对于“艺术”这个词的诠释也会变得不同。这段时间里&#xff0c;我的朋友在朋友圈、微博发布的视频都带有浓浓的个人风格&#xff0c;但总体上都是依据“涂鸦”这一形式来进行的。通过在视频中绘制涂鸦&#xff0c;来抒发内心的情绪、展示对艺术…

如何用ps做出街头涂鸦效果

制作过程大概几分钟时间即可搞定&#xff0c;我们主要用的是陌鱼社区街头涂鸦喷绘行为艺术效果PS动作&#xff0c;需要的可以搜一下应该可以找到&#xff0c;下面是效果&#xff1a; 01、载入我们下载文件包时面的预设文件&#xff0c;包括笔刷、图案、动作&#xff0c;关闭Ps软…

ROS:坐标管理系统

目录 一、机器人中的坐标变换二、TF功能包2.2TF功能包简介2.2TF坐标变换实现2.3TF案例 三、小海龟跟随实验3.1打开小程序3.2查看当前的TF树3.3坐标相对位置关系可视化1&#xff08;tf_echo&#xff09;3.4坐标相对位置关系可视化2&#xff08;rviz&#xff09; 一、机器人中的坐…

人事管理项目-前端实现

人事管理项目-前端实现 引入Element和Axios开发Login页面配置路由配置请求转发启动前端项目 引入Element和Axios 前端UI使用Element&#xff0c;网络请求则使用Axios&#xff0c;因此首先安装Element和Axios依赖&#xff0c;代码如下&#xff1a; 依赖添加成功后&#xff0c;接…

妖精的尾巴手游快速升级辅助 爱蜂窝自动新手挂机升级

妖精的尾巴手游上线了&#xff0c;是一款特别火的手游&#xff0c;那么如果才能快速升级&#xff0c;迅速提升战斗力呢&#xff0c;主要依靠游戏里面的这些内容。 方式一&#xff1a;主线任务 主线任务是快速升级中速度最快的&#xff0c;能获得大量的经验和等级&#xff0c;后…

妖精的尾巴勇气之旅服务器维护,妖精的尾巴勇气之旅攻略大全 新手攻略开局发展技巧[多图]...

妖精的尾巴勇气之旅怎么玩&#xff0c;作为一个新手玩家来说的话&#xff0c;在开局的时候要做些什么会比较的好&#xff0c;如何能够更好的上手&#xff0c;带来一个比较好的发展&#xff0c;也可以为后续的阶段起到一个比较不错的铺垫呢&#xff1f;下面来了解下&#xff01;…

【妖精的尾巴win7动漫主题】

主题描述&#xff1a;本主题是由主题世界win7主题下载独家原创制作而成 本地下载 迅雷下载 妖精的尾巴win7动漫主题介绍 妖精的尾巴卡通桌面壁纸下载《鼠标右键另存为本地》 妖精的尾巴卡通桌面主界面效果图 妖精的尾巴卡通桌面开始菜单效果图 妖精的尾巴卡通桌面图标效果图 妖…

智能算法实现PID智能车控制系统

目录 第一章 绪论 1.1 智能车概述 1.2 智能PID研究现状 1.3 本文工作 第二章 PID控制简介 第三章 内模PID简介 3.1 内模PID控制 第四章 内模智能PID智能车控制系统设计 4.1 系统设计 4.2 内模控制原理 第五章 系统仿真及结果分析 5.1 系统仿真分析 5.2 控制效…