学习慕课网canvas倒计时实例笔记


视频地址:慕课·canvas小球倒计时
代码下载请移步:github
演示地址:在线演示

一、canvas简介

canvas是HTML5中新加入的标签,但是其真正的控制却大多需要javascript来控制。在标签内可以写一些不支持HTML5的浏览器的提示文字,不用担心如果浏览器支持HTML5则标签内的文本不会显示。
示例:

<canvas id="canvas" >
      您的浏览器不支持html5请使用现代浏览器。
</canvas>

提示:由于需要在javascript中获取该元素,所以需要给canvas设置id属性

二、canvas基础

在页面中声明canvas标签后就可以在javascript中获取并操作canvas画布啦。

<script type="text/javascript">
//页面默认调用函数      
window.onload=function(){
         //获取canvas标签元素
         var canvas=document.getElementById('canvas');

         //设置canvas宽、高
         canvas.width=500;
         canvas.height=500;    

        //获取2d上下文
        var context=canvas.getContext('2d');
 }
</script>

以上代码就是获取和初步设置cnavas属性的代码。在设置canvas的宽高时不建议添加单位,因为可以把canvas看作一张画布,设定宽、高时除了设定画布大小之外也需要设置画布的点密度,如果带单位时只能设置画布的大小,而如果不带单位除了设置画布大小外也同时设置了画布的点密度。
在获取到标签元素后如果要在画布中进行绘制还需要获取文件的上下文,可以获取2d、3d上下文,但是html5中推荐支持的是2d上下文,所以用2d上下文浏览器支持更好,而且大多数图形使用2d上下文已经够用。

三、canvas API简介

有了一张画布后我们就可以在画布上进行绘制啦。

  • 绘制路径
    可以使用moveTo(x,y)方法设置路径的起点,使用方法lineTo(x,y)设置绘制路径的终点,使用stroke()方法渲染路径。但是在我们连续绘制多条路径时会发现绘制的多条路径格式设置是相同的。因此为了避免绘制不同样式路径造成的不便可以在绘制路径前用beginPath()函数和closePath()函数把路径包裹起来,这样在重新绘制时就可以使用新的样式啦。
/*----------- draw line 1 --------------*/
        context.beginPath();

        context.moveTo(100,100);
        context.lineTo(700,700);
        context.lineTo(100,700);
        context.lineTo(100,100);
        context.lineTo(700,700);

        context.lineWidth=5;
        context.strokeStyle="red";
        context.stroke();
        //context.fill();

        context.closePath();

API:

|函数|性质|意义|
| :---: | : ---: | :---: |
|beginPath()| 方法| 开始一段路径 |
|moveTo() | 方法 | 路径起始点 |
|lineTo() | 方法 | 路径终点 |
|lineWidth |属性 | 路径宽度 |
|strokeStyle|属性 | 路径颜色 |
|stroke() |方法 | 渲染路径 |
|fill() |方法 | 填充封闭路径 |
|closePath()|方法 | 结束一段路径 |

  • 绘制矩形
    绘制矩形也可以分为填充和绘制边框两种形式,使用fillRect(x,y,width,height)函数绘制实心矩形,使用strokeRect(x,y,width,height)函数绘制空心矩形。clearRect(x,y,width,height)函数来清除矩形区域。
/*--------- draw rect-------------------*/
        context.beginPath();

        context.fillStyle='yellow';
        context.fillRect(10,10,10,10);
        
        context.strokeStyle="black";
        context.strokeRect(30,30,30,30);


        context.closePath();

渐变的色条其实也是一个矩形块,可以使用createLinearGradient(x1,y1,x2,y2)函数来设置渐变色带的渐变方向,x1,y1代表起点,x2,y2代表终点。可以使用addColorStop(0,'颜色值'),addColorStop(1,'颜色值')来设置起点颜色和终点颜色。然后用设定的样式填充一个矩形。

/*-------- draw linearGradient ---------*/
        var linear=context.createLinearGradient(0,0,50,300);

        linear.addColorStop(0,'red');
        linear.addColorStop(1,'green');

        context.fillStyle=linear;
        context.fillRect(10,10,200,200);

同样的绘制阴影也可以看作是在图形后面绘制一个其它矩形色块,代码如下。

/* ------ draw shandow -----------------*/
        context.beginPath();

        context.shadowOffsetX = 20; // 设置水平位移
        context.shadowOffsetY = -20; // 设置垂直位移
        context.shadowBlur = 6; // 设置模糊度
        context.shadowColor = "rgba(0,0,0,0.5)"; // 设置阴影颜色

        context.fillStyle = "#CC0000"; 
        context.fillRect(150,200,200,400);

        context.closePath();
  • 绘制圆形、弧线
    弧线的绘制函数arc(x,y,r,startAngle, endAngle, anticlockwise)
    x,y表示圆心的坐标,r表示半径,startAngle、endAngle代表开始弧度与结束弧度,anticloclwise表示弧线绘制是顺时针(false)还是逆时针(true)。
/*----------- draw circly  -----------*/
        context.beginPath();

        context.lineWidth=5;
        context.strokeStyle="blue";

        context.arc(300,300,200,0,1.5*Math.PI,true);
        context.stroke();

        context.closePath();

如果要绘制原型将开始弧度、结束弧度分别设为0,2PI即可

* ----------- 实心圆 ---------------*/
        context.beginPath();

        context.fillStyle='red';
        context.arc(50,50,50,0,2*Math.PI,true);
        context.fill();

        context.closePath();
/*----------- 空心圆 ---------------*/
        context.beginPath();

        context.lineWidth=5;
        context.strokeStyle='red';
        context.arc(200,200,50,0,2*Math.PI,true);
        context.stroke();

        context.closePath();
  • 绘制文字
    使用fillText(string,x,y)函数来绘制一段文字,string代表要绘制的问题,x、y代表起点坐标。strokeText(string,x,y)函数绘制空心文字。
/* -------  绘制文字 --------------*/
        context.beginPath();
        //设置字体
        context.font="Bold 20px Arial";
        //设置对齐方式
        context.textAlign="left";
        context.lineWidth=2;
        context.fillStyle="slive";
        context.fillText("Hello ",300,300);
        context.strokeText("world!",400,400);

        context.closePath();
  • 绘制图片
    绘制图片之前必须首先加载图像。
        var img=new Image();//创建对象
        img.src="img/login2.jpg";//加载图片

        img.onload=function(){
        //加载图像
            if(img.width!=canvas.width){
                canvas.width=img.width;
            }
            if(img.height!=canvas.height){
                canvas.height=img.height;
            }
            context.drawImage(img,0,0);
        }
  • 保存、加载上下文设置
context.save(); 

context.shadowOffsetX = 10;
context.shadowOffsetY = 10;
context.shadowBlur = 5;
context.shadowColor = "rgba(0,0,0,0.5)";

context.fillStyle = "#CC0000";
context.fillRect(10,10,150,100);

context.restore(); 
context
context.fillStyle = "#000000";
context.fillRect(180,10,150,100);

上面代码先用save方法,保存了当前设置,然后绘制了一个有阴影的矩形。接着,使用restore方法,恢复了保存前的设置,绘制了一个没有阴影的矩形。

四、像素处理

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

推荐阅读更多精彩内容