`

canvas学习(十五):学写一个字

阅读更多

先来张效果图:

这个特效是跟着慕课网上的视频学的,视频链接如下:https://www.imooc.com/learn/284

源码和技术点已经上传到附件,有需要的可以查看、下载。

下面直接上代码(PS:代码中的注释是根据个人理解添加的,并不是老师原有的注释):

页面结构

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>canvas学习-学写一个字</title>
  <link type="text/css" href="handwriting.css" rel="stylesheet"/>
  <meta name="viewport"
		content="height=device-height,
				width=device-width,
				initial-scale=1.0,
				minimum-scale=1.0,
				maximum-scale=1.0,
				user-scalable=no"/>
  <script type="text/javascript" src="handwriting.js"></script>
  <script type="text/javascript" src="jquery.min.js"></script>
 </head>
 <body>
  <canvas id="myCanvas">
		您的浏览器不支持canvas,请换个浏览器试试
		<!--这句话在支持canvas的浏览器中会被忽略,不支持的则会显示出来-->
	</canvas>
	
	<!--颜色选择和清除 -->
	<div id="controller">
		<div id="black_btn" class="color_btn color_btn_selected"></div>
		<div id="red_btn" class="color_btn"></div>
		<div id="orange_btn" class="color_btn"></div>
		<div id="yellow_btn" class="color_btn"></div>
		<div id="green_btn" class="color_btn"></div>
		<div id="cyan_btn" class="color_btn"></div>
		<div id="blue_btn" class="color_btn"></div>		

		<div id="clear_btn" class="op_btn">清&nbsp;除</div>
		<div class="clearfix"></div>
	</div>
 </body>
</html>

CSS样式

#myCanvas{
	height:100%;
	display:block;
	margin:0 auto;
}
#controller{
	margin:0 auto;
}
.op_btn{
	float:right;
	margin:10px 0 0 10px;
	border:2px solid #aaa;
	width:80px;
	height:40px;
	line-height:40px;
	font-size:20px;
	text-align:center;
	border-radius:5px 5px;
	cursor:pointer;
	background-color:white;
	font-weight:bold;
	font-family:Microsoft Yahei,Arial;
}
.op_btn:hover{
	background-color:#def;
}
.clearfix{
	clear:both;
}
.color_btn{
	float:left;
	margin:10px 5px 0 0;
	border:5px solid white;
	width:40px;
	height:40px;
	border-radius:5px 5px;
	cursor:pointer;
}
.color_btn:hover{
	border:5px solid violet;
}
.color_btn_selected{
	border:5px solid blueviolet;
}
#black_btn{
	background-color:black;
}
#red_btn{
	background-color:red;
}
#orange_btn{
	background-color:orange;
}
#yellow_btn{
	background-color:yellow;
}
#green_btn{
	background-color:green;
}
#blue_btn{
	background-color:blue;
}
#cyan_btn{
	background-color:cyan;
} 

JS代码

//学习链接:http://www.imooc.com/learn/284
var windowWidth = 600;
var windowHeight = 600;
var isMouseDowm=false;//鼠标是否按下

var myCanvas = null;
var context = null;
var lastLoc = {x:0,y:0};//鼠标最后一个落脚点
var lastTimestamp=0;
var lastLineWidth = -1;//最后一次笔画的大小
	
var strokeColor = "black";
window.onload=function(){
	myCanvas = document.getElementById("myCanvas");
	if(myCanvas.getContext("2d")){
		windowWidth = document.documentElement.clientWidth-20;
		windowHeight = document.documentElement.clientHeight-20-60;//60:清除按钮所需要的高度
		//取两个数中最小的那个值
		if(windowWidth>windowHeight){windowWidth = windowHeight;}
		else{windowHeight = windowWidth;}
		//alert(windowWidth);
		myCanvas.width = windowWidth;
		myCanvas.height = windowHeight;
		context =myCanvas.getContext("2d");
		//alert(myCanvas.width+"\n"+myCanvas.height);
	
		//控制功能区的大小
		$("#controller").css("width",windowWidth+"px");
		//绘制一个米字格
		drawGird();

		//阻止鼠标的默认事件
		myCanvas.onmousedown=function(e){
			e.preventDefault();
			//console.log("mouse down");
			startStroke({x:e.clientX,y:e.clientY});
		}
		myCanvas.onmouseup=function(e){
			e.preventDefault();
			//console.log("mouse up");
			endStroke();
		}
		myCanvas.onmouseout=function(e){
			e.preventDefault();
			//console.log("mouse out");
			endStroke();
		}
		myCanvas.onmousemove=function(e){
			e.preventDefault();
			if(isMouseDowm){
				//console.log("mouse move");
				moveStroke({x:e.clientX,y:e.clientY});
			}
		}

		//添加触控事件
		myCanvas.addEventListener("touchstart",function(e){
			e.preventDefault();
			var touch = e.touches[0];//只获取一个触控点
			startStroke({x:touch.pageX,y:touch.pageY});
		});
		myCanvas.addEventListener("touchend",function(e){
			e.preventDefault();
			endStroke();
		});
		myCanvas.addEventListener("touchmove",function(e){
			e.preventDefault();
			if(isMouseDowm){
				var touch = e.touches[0];//只获取一个触控点
				moveStroke({x:touch.pageX,y:touch.pageY});
			}
		});

		//清除功能
		document.getElementById("clear_btn").onclick=function(){
			//清除画布中的内容
			context.clearRect(0,0,windowWidth,windowHeight);
			//重新绘制米字格
			drawGird();
		}

		//选择颜色功能
		$(".color_btn").click(function(){
			//清除选中状态
			$(".color_btn").removeClass("color_btn_selected");
			$(this).addClass("color_btn_selected");
			strokeColor = $(this).css("background-color");
		});
		
	}else{
		return false;
	}
}

//开始绘制
function startStroke(point){
	isMouseDowm=true;
	lastLoc = windowToCanvas(point.x,point.y);
	lastTimestamp = new Date().getTime();
	//alert(lastLoc.x+","+lastLoc.y);
}

//结束绘制
function endStroke(){
	isMouseDowm=false;
}

//绘制过程中
function moveStroke(point){
	//获取鼠标所在canvas的当前位置
	var curLoc = windowToCanvas(point.x,point.y);
	
	//添加“根据写字速度的快慢调整笔画大小”的应用
	//计算两个点之间的距离
	var s = calcDistance(curLoc,lastLoc);
	//计算绘制两个点需要的时间
	var curTimestamp = new Date().getTime();
	var t = curTimestamp-lastTimestamp;//使用当前时间减去最后一个落笔的时间
	//根据s和t的值计算线的宽度
	var lineWidth = calcLineWidth(s,t);

	//alert(curLoc);
	context.beginPath();
	context.moveTo(lastLoc.x,lastLoc.y);
	context.lineTo(curLoc.x,curLoc.y);
	context.closePath();
	context.strokeStyle = strokeColor;
	context.lineCap="round";
	context.lineJoin="round";
	context.lineWidth = lineWidth;
	context.stroke();

	lastLoc = curLoc;
	lastTimestamp = curTimestamp;
	lastLineWidth = lineWidth;
}

//该方法用来将窗口坐标转换成canvas中的坐标
function windowToCanvas(x,y){
	var bbox = myCanvas.getBoundingClientRect();
	return {x:Math.round(x-bbox.left),y:Math.round(y-bbox.top)};
}

//该方法用来计算两个点之间的距离
function calcDistance(loc1,loc2){
	return Math.sqrt((loc1.x-loc2.x)*(loc1.x-loc2.x)+(loc1.y-loc2.y)*(loc1.y-loc2.y));
}

//该方法根据路程和时间计算速度,依次计算线条宽度
function calcLineWidth(s,t){
	var v = s/t;
	//先判断运笔速度较快和较慢时的情况
	var min = 5,max = 20;//笔画大小
	var min2 = 0.5,max2=10;//运笔速度大小
	var result = min;
	if(v<=min2){//运笔速度特别慢,那么笔画应该特别大
		result = max;
	}else if(v>=max2){//运笔速度特别快,那么笔画应该特别小
		result = min;
	}else{//不快也不慢的情况下,使用差值的方式逐渐减
		//计算方法:使用最大值-(当前速度与最小速度之间的差值)占(最大速度与最小速度之间差值)的比例 * (最大笔画与最小笔画之间的差值)
		result = max - (v-min2)/(max2-min2)*(max-min)
	}

	//解决平滑问题
	if(lastLineWidth==-1){//说明还没有赋值
		return result;
	}

	return lastLineWidth*3/4+result*1/4;
}

//该方法用来绘制米字格
function drawGird(){
	context.save();
	//绘制一个红色的正方形
	context.strokeStyle="rgb(230,11,9)";
	context.beginPath();
	context.rect(0,0,windowWidth,windowWidth);
	context.closePath();
	context.lineWidth = 5;
	context.stroke();

	//绘制米字格
	context.beginPath();
	context.moveTo(0,0);
	context.lineTo(windowWidth,windowHeight);

	context.moveTo(windowWidth/2,0);
	context.lineTo(windowWidth/2,windowHeight);

	context.moveTo(windowWidth,0);
	context.lineTo(0,windowHeight);

	context.moveTo(0,windowHeight/2);
	context.lineTo(windowWidth,windowHeight/2);

	context.closePath();
	context.lineWidth = 1;
	context.stroke();
	context.restore();
}

 

  • 大小: 35.7 KB
分享到:
评论

相关推荐

    Canvas入门实例01:猜字母

    【Canvas入门实例01:猜字母】是一个针对前端开发者的基础教程,主要介绍如何利用HTML5的Canvas元素进行图形绘制和交互。在这个实例中,我们将学习Canvas的基本用法,包括画布的设置、文本渲染以及用户事件处理。...

    canvas学习(十六):绘制时钟

    在本篇【canvas学习(十六):绘制时钟】中,我们将探讨HTML5中的Canvas API,它是Web开发中用于在网页上动态绘制图形的强大工具。Canvas API允许开发者使用JavaScript来绘制2D图形,包括简单的线条、形状以及复杂的...

    canvas学习(二):弹跳小球

    在本篇【canvas学习(二):弹跳小球】中,我们将深入探讨HTML5的Canvas元素以及如何利用它来创建动态的、交互式的弹跳小球效果。Canvas是HTML5的一个重要特性,允许开发者在网页上进行动态图形绘制,为网页增添了...

    Html5 Canvas的充分运用:实用示例

    - 文件名如`step1`到`step13`可能代表逐步教学,每一步可能包含一个具体示例,如`step11.jpg`可能是第十一步的结果截图。 - 逐个学习这些步骤,可以深入理解Canvas的使用。 7. **源码与工具** - 源码:博客可能...

    HTML Canvas 学习过程中的一些代码.zip

    HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 ...

    html5 canvas米字格式手写文字练习代码.zip

    这个“html5 canvas米字格式手写文字练习代码”压缩包提供了一个实例,可以帮助学习者更好地理解和掌握Canvas API的用法,特别是关于文字绘制的部分。 在HTML5中,Canvas是一个二维绘图上下文,通过JavaScript来...

    canvas学习(十三):clip之图形剪辑

    在“canvas学习(十三):clip之图形剪辑”这篇博文中,作者详细介绍了如何利用`clip()`进行图形限制和绘制。 首先,`clip()`方法的基本概念是创建一个剪辑区域,该区域定义了后续绘制操作的影响范围。简单来说,...

    canvas学习(十二):图形透明及交叠效果设置

    在canvas学习中,图形透明及交叠效果是两个重要的概念,它们可以让我们创建出丰富的视觉效果和动态交互。本文将详细解析这两个知识点,并通过提供的标签和文件名来具体阐述。 首先,我们来看“图形透明”这个概念。...

    微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)

    微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的...

    html5 canvas米字格式手写文字练习代码

    HTML5 Canvas是网页开发中的一个强大工具,它允许开发者在网页上进行图形绘制,包括动态图像、动画甚至游戏。在这个“html5 canvas米字格式手写文字练习代码”项目中,用户可以通过鼠标在Canvas上模拟手写汉字,特别...

    微信小程序canvas实现文字自由移动

    在微信小程序中,Canvas是一个非常重要的组件,它允许开发者在界面上绘制图形、文字等元素,从而实现丰富的交互效果。本项目着重讲解如何利用Canvas在微信小程序中实现文字的自由移动。 首先,Canvas是一个HTML5的...

    canvas学习(三):炫丽的电子时钟

    在本篇博客“canvas学习(三):炫丽的电子时钟”中,作者通过HTML5的canvas元素展示了如何创建一个动态且具有视觉吸引力的电子时钟。canvas是HTML5中用于绘制图形的一个重要组成部分,它允许开发者用JavaScript来...

    canvas:学习学习学习

    学习学习学习 1:初学canvas getContext():上下文环境 2:画矩形 fillRect(x,y,width,height) 不加单位 填充矩形 strokeRect(x,y,wdith,height) 不加单位 带边框的矩形 相当于在中间画 100 :99.5-100.5 (99-101) ...

    HTML5 Canvas核心技术源码技术代码

    Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、...

    canvas学习.zip

    由于标题为"canvas学习.zip",并且描述提到了"canvas的官网小例子",我们可以从中了解到这个压缩包可能包含了一些用于学习`canvas`的实例代码。 `canvas`标签是一个内联元素,通过JavaScript API与之交互。在HTML中...

    canvas使用外部字体

    在网页设计中,canvas元素是HTML5引入的一个强大的特性,它允许动态、程序化地绘制2D图形。这篇博客“canvas使用外部字体”探讨了如何在canvas上使用非标准字体,即外部字体,来增强图形的视觉效果。下面将详细阐述...

    分享一个适合学习canvas的案例

    【标题】:“分享一个适合学习canvas的案例” 在HTML5中,Canvas是一个强大的绘图工具,它允许开发者通过JavaScript在网页上进行动态图形绘制。这个案例“google-bouncing-balls”是一个非常适合初学者掌握和练习...

    用canvas写的一个对比度

    在这个"用canvas写的一个对比度"的例子中,我们将探讨如何利用JavaScript操作Canvas API来调整图像的对比度,从而实现图片的动态视觉调整。 首先,Canvas API提供了一个名为`getImageData`的方法,它可以从画布上...

    canvas数字时钟

    在这个“canvas数字时钟”项目中,开发者利用Canvas结合JavaScript和CSS,创建了一个实时更新的数字时钟。下面将详细解释这个项目中涉及的技术和知识点。 1. **Canvas基础**: - **Canvas元素**:HTML5中的`...

    canvas.ts:Node.js Canvas LMS客户端

    对于想要深入Canvas LMS集成的开发者来说,参与这个项目的贡献或者跟踪其进展,将是一个学习和实践的好机会。 总结来说,Canvas.ts是Node.js环境下用于与Canvas LMS进行交互的客户端库,它简化了API调用的过程,...

Global site tag (gtag.js) - Google Analytics