Canvas系列学习之起始篇

html5里面最让人心动的技术,对我来说,canvas绝对是首选,它没出现之前,一切网页相关的游戏动画非flash莫属.

canvas来临时,是时候用用新鲜的血液了.


Canvas入门

canvas的本质就是提供了一套前端可用的gui接口,包括画线,画方,画圆,画字等常用的gui功能,先来看看在浏览器端的引用

<canvas id="canvas" width=500 heigth=400></canvas>

这里要说下,canvas有元素大小与绘图大小之分,默认的绘图大小是300*150,假如不直接添加width,height时,启用默认值,假如在css样式表里设置width,height时,会造成意想不到的效果,因为canvas绘图承认的大小是它的绘图大小,跟元素本身大小关系不大,所以建议直接在html的元素标签上直接写上宽高,css样式表里不要设置宽高.

然后所有的绘图操作其实都是在canvas的绘图上下文中进行的,方法是调用canvas实例的getContext方法

    var canvas = document.querySelector('#canvas');
    var context = canvas.getContext('2d');

以后基本上所有的绘画操作都在context上面进行

今天的任务是实现一个精灵图片的鼠标定位功能,效果图如下:

精灵图片的鼠标定位

先说下这里要用到的几个功能点

  • 绘制背景网格线
  • 绘制精灵图片
  • 绘制参考线
  • 定义鼠标事件

先来说说绘制背景网格线

网格线是横竖两方向铺满的,原理就是不断的在两方向上画线,保证线之前的间距,直到画满为止,先上一个画一条线的例子

// 设置描边的样式
context.strokeStyle = "#ccc";
// 设置绘制线的宽度
context.lineWidth = 0.5;
// 开始进入画线状态
context.beginPath();
// 移到起始点
context.moveTo(50, 50);
// 连到终点
context.lineTo(100, 100);
// 开始描边
context.stroke();

上面的代码就是画线的最基本实现,下面我们来看一个完整的实现背景网格的功能.

// 画背景线
function drawBackground(){
    var SPACE = 15,
        i = canvas.height,
        j = canvas.width;
    context.clearRect(0, 0, canvas.width, canvas.height);
    context.strokeStyle = 'lightgray';
    context.lineWidth = 0.5;
    while(i >= SPACE){
        context.beginPath();
        context.moveTo(0, i);
        context.lineTo(canvas.width, i);
        context.stroke();
        i -= SPACE;
    }
    while(j >= SPACE){
        context.beginPath();
        context.moveTo(j, 0);
        context.lineTo(j, canvas.height);
        context.stroke();
        j -= SPACE;
    }
}

然后我们来绘制精灵图片

使用drawImage方法可以画一个图片到绘图上下文中去,这里的图片资源点击这里获取,下载

// 画精灵图
function drawImg(){
    context.drawImage(img, 0, 0);
}

var img = new Image();
img.src = 'img/running-sprite-sheet.png';
img.onload = function(){
    drawImg();
};

然后实时的根据鼠标位置来画参考线

关于坐标,这里要说下,默认事件参数里的坐标是相对于文档的,所以在canvas里画坐标的话,需要转换一下,这里给出转换的代码

// 切换网页坐标为canvas坐标
function windowToCanvas(x, y){
    var bbox = canvas.getBoundingClientRect();
    return {
        x: x - bbox.left * (canvas.width / bbox.width),
        y: y - bbox.top * (canvas.height / bbox.height)
    }
}

然后我们来根据当前坐标画两条互相垂直的参考线,代码如下:

// 画垂直线
function drawVertical(x){
    context.beginPath();
    context.moveTo(x + 0.5, 0);
    context.lineTo(x + 0.5, canvas.height);
    context.stroke();
}

// 画水平线
function drawHorizontal(y){
    context.beginPath();
    context.moveTo(0, y + 0.5);
    context.lineTo(canvas.width, y + 0.5);
    context.stroke();
}

// 画定位网格
function drawGuidelines(x, y){
    context.strokeStyle = 'rgba(0, 230, 0, .8)';
    context.lineWidth = 0.5;
    drawVertical(x);
    drawHorizontal(y);
}

上面就是定义一个水平和垂直的绘制方法然后定义一个总的方法来一起调用.

最后我们来定义我们的事件

这里定义canvasmousemove事件,然后利用事件参数里的坐标信息实时的调用上面的绘制方法

canvas.onmousemove = function(e){
    var loc = windowToCanvas(e.clientX, e.clientY);
    drawBackground();
    drawImg();
    drawGuidelines(loc.x, loc.y);
    updatePrint(loc.x, loc.y);
}

其实canvas的绘图流程大概都分下面几步

  • 设置描边,填充的样式信息
  • 设置路径信息
  • 开始描边或者填充

总结

canvas是一个比较好玩的技术,只要你有想像力,就可以画出任何东西出来,这个系列将会全面的讲解它的用法,尽请期待.

时间: 2024-10-30 23:49:16

Canvas系列学习之起始篇的相关文章

Android NDK 环境搭建 之 起始篇NDK HelloWorld

ADT插件:管理Android SDK和相关的开发工具的 NDK插件:用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件(所以本文直接针对ADT 20以上版本进行说明) 到Android官网下载最新的NDK,注:NDK版本在r7以上之后就集成了Cygwin,而且还是十分精简版.比起下载Cygwin要方便多啦(Cygwin以前需要单独安装和配置,现在已被集成)! 下载链接见:http://developer.android.com/tools

canvas使用注意点总结

canvas默认宽高是300.150,为避免异常,最好使用显示属性添加而不通过css来添加宽高,下面简单的为大家介绍下canvas使用注意事项,感兴趣的朋友可以参考下哈,希望对大家有所帮助   1.canvas中文教程https://developer.mozilla.org/zh-CN/docs/Canvas_tutorial 2.canvas默认宽高是300.150,为避免异常,最好使用显示属性添加而不通过css来添加宽高 3.在canvas标签内部添加不支持canvas标签的浏览器的说明

HTML5 Canvas draw方法制作动画效果示例

HTML5 Canvas动画效果演示 主要思想: 首先要准备一张有连续帧的图片,然后利用HTML5 Canvas的draw方法在不同的时间间隔绘制不同的帧,这样看起来就像动画在播放. 关键技术点: JavaScript 函数setTimeout()有两个参数,第一个是参数可以传递一个JavaScript方法, 另外一个参数代表间隔时间,单位为毫秒数.代码示例: setTimeout( update, 1000/30); Canvas的API-drawImage()方法,需要指定全部9个参数: c

[Canvas前端游戏开发]——FlappyBird详解

一直想自己做点小东西,直到最近看了本<HTML5游戏开发>,才了解游戏开发中的一点点入门知识. 本篇就针对学习的几个样例,自己动手实践,做了个FlappyBird,源码共享在度盘 :也可以参考github,里面有更多的游戏样例. 游戏截图 HTML5之Canvas Canvas是Html5中用于绘图的元素,它可以绘制各种图形,比如长方形,多边形,圆形等等.如果想要了解Canvas的使用可以参考: http://www.w3school.com.cn/tags/html_ref_canvas.a

BaaS后端即服务 - 通往中台架构之路

该文章来自阿里巴巴技术协会(ATA)精选集 BaaS代表第二代云服务,相对于AWS.阿里云等公有云(IaaS,PaaS)是第一代云服务,通过广泛部署云数据中心解决了开发和运维系统不需要管理服务器的问题,BaaS则在第一代公有云数据中心基础之上,对云计算资源进一步封装.简化与优化,提供开发.运维和服务的一站式云服务. 这就是所谓BaaS(后端即服务)模式的兴起,BaaS将公有云数据中心资源根据前端应用场景打包,通过简化的调用接口提供给开发者使用.通过减负,开发者得以集中精力于用户的研究.APP软件

《计算机组成原理》----导读

目 录 第一部分 起始篇第1章 计算机系统体系结构1.1 什么是计算机系统体系结构1.2 体系结构和组成1.2.1 计算机系统和技术1.2.2 计算机体系结构在计算机科学中的地位1.3 计算机的发展1.3.1 机械计算机1.3.2 机电式计算机1.3.3 早期的电子计算机1.3.4 微机和PC革命1.3.5 摩尔定律和进步的历程1.3.6 存储技术发展1.3.7 普适计算1.3.8 多媒体计算机1.4 存储程序计算机1.4.1 问题描述1.4.2 解决方法1.4.3 构造一个算法1.4.4 计算

图书出版编辑加工并一是一种简单容易的事情,向晓菲、holly编辑表示敬意

在翻译<CSS: The Missing Manual>中文<CSS实战手册>的过程中与出版社的编辑进行紧密的配合,同时对她们的认真而严谨的工作作风表示敬意. 一般来说,译书.出书至少都是需要经过三审三校的,真可谓是路漫漫... 很辛苦!的确很辛苦!这需要很大的耐心并且能够一直坚持到底! 说到底是一种责任感在支撑着. 再一次深表表敬意! 附上她们的博客: 晓菲的博客 http://pekingrose.blog.163.com 她博客里关于编辑加工的文章 图书出版流程工作整理--起

安卓(android)实现 翻页功能原理分析

Android平台中的三种翻页效果实现. 第一种翻页效果如下:     实现原理:   当前手指触摸点为a,则 a点坐标为(ax,ay), 由三角形acb与三角形cmb为对称三角形并且直线cp为am垂直平分线,则 B点坐标为(ax/2,ay/2). 作gf垂直于om且cb垂直于am, 三角形cfg与gfm相似,则 cf:gf = gf:mf      cf=(gf * gf) / mf     gf长度为g点纵坐标     mf长度为g点横坐标     cf长度可求    c点坐标可求 由c点.

Xamarin.Android开发实践(十一)

原文:Xamarin.Android开发实践(十一) Xamarin.Android之使用百度地图起始篇 一.前言 如今跨平台开发层出不穷,而对于.NET而言时下最流行的当然还是 Xamarin,不仅仅能够让我们在熟悉的Vs下利用C#开发,在对原生态类库的支持方面也有着非常的好支持,今天我们将会以百度地图类库来介绍如何实用 第三方原生态类库.如果需要在Fragment中使用请跳转到(由网友monosir提供)该篇文章.   二.正文 笔者采用的是3.0.0的版本,需要以下文件: baidumap