首先利用定义下canvas得样式

<canvas width="1024" height="720" id="canvas" style="border: 1px solid #808080;display: block;margin: 100px auto;>你的游览器不支持canvas</canvas>

这里主要要说的就是宽高,不要在style里面定义,不然会被拉伸。(对于这点,建议大家看下W3c文档,不是很懂)

高度和宽度属性确定画布的宽度和高度的坐标系统,而CSS属性只确定大小的盒子,它会显示。

    var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

获取对象,然后获取上下文进行画图。

好的,接下来来个小例子(画弧)

  1. //设置线宽,颜色(我喜欢通俗的称他为空心画法)
  1. ctx.lineWidth = 2;
  2. ctx.strokeStyle = '#176785';
     //arc是花弧形,如果用fill的画法的话,会把他封闭起来。
ctx.beginPath();
ctx.arc(512, 360, 100, 0.5 * Math.PI, 1 * Math.PI);
ctx.stroke();
ctx.closePath();

对于ctx.beginPath();和 ctx.closePath();我觉得是canvas灵魂,一些好的canvas的引擎之所以效率高,他们有很大程度的关系。

1.比如,有些人画的感觉画出来的canvas是带有锯齿状,就是在画布上,绘制了同样一件事情N次之后的效果。

看下面一个例子

     ctx.beginPath();
ctx.arc(512, 360, 100, 0.5 * Math.PI, 1 * Math.PI);
ctx.closePath();
ctx.stroke();

这就是ctx.closePath();的作用,闭合那些线,但是fill的画法默认是带有ctx.closePath();这个功能的,而ctx.beginPath();的作用就是相当于函数中的分割了,分割作用域。

2.例子就举上面的,如果将上面两段代码何必,去掉ctx.beginPath();,那么那段弧形会被绘制两次,而第二个则绘制一次。言下之意就是,假如没有ctx.beginPath();的话,代码中要绘制100个图片,第一个就会绘制100次,第一个99次,总而言之是100+99+98+。。。。。

3.接下来两个小例子。

      //定义一个渐变的颜色,其实坐标,x,y,w,h

    var color = ctx.createLinearGradient(512, 460, 512, 260);
// 开始颜色,和结束的颜色 color.addColorStop(0, '#499989');
color.addColorStop(1, '#176785'); ctx.beginPath();
ctx.fillStyle = color;
ctx.arc(512, 360, 99, 0, 2 * Math.PI);
ctx.fill();
ctx.closePath(); //绘制文本
var a = 12;
ctx.font="50px Arial";
ctx.fillStyle = "#fff";
     //居中
ctx.textAlign = "center";
ctx.beginPath(); //文字内容, 起始坐标,宽度
ctx.fillText(a, 510, 375 , 64);
ctx.closePath();

4.接下来我们把上面内容结合起来。

    //定时器
var timeClear;
//定义一些数字
var arcNum = 0.02,
textNum = 1; function load1(){ if(textNum >= 101){
return 0;
} ctx.lineWidth = 2;
ctx.strokeStyle = '#176785'; ctx.beginPath();
ctx.arc(512, 360, 100, (0.5 + arcNum - 0.02) * Math.PI, (0.5 + arcNum) * Math.PI);
ctx.stroke();
ctx.closePath(); //绘制里面的渐变颜色
var color = ctx.createLinearGradient(512, 460, 512, 260);
color.addColorStop(0, '#499989');
color.addColorStop(1, '#176785'); ctx.beginPath();
ctx.fillStyle = color;
ctx.arc(512, 360, 99, (0.5 - arcNum/2)* Math.PI, (0.5 + arcNum/2) * Math.PI);
ctx.fill();
ctx.closePath(); //绘制文本
ctx.font="80px Arial";
ctx.fillStyle = "#fff";
ctx.textAlign = "center";
ctx.beginPath();
ctx.fillText(textNum, 510, 385 , 124);
ctx.closePath();
//ctx.clearRect(0,0,1024,720); arcNum = arcNum + 0.02;
textNum = textNum + 1; } timeClear = setInterval(load1, 60);

看起来不太舒服,建议自己在电脑上测试:

在线调试唯一地址:http://www.gbtags.com/gb/debug/7400a9ba-51a7-409b-b1f4-b01363b9c625.htm

一个简单的loading写完了,但是里面有很多问题,比如那个fill和text都是有部分重复的绘制,绘制了99次的,其实我主要 想用fill那个圆来取代每次画好的文本还要clear。如果你把文字换种颜色可能明白我的意思了。然后这会导致底部绘制100次,导致底部出现锯齿的样 子。

而且,绘制圆放在前面,就是相当于clearRect的作用,去清除文字。

面对这个问题,不知道大家如何解决的。

阅读原文:10分钟,利用canvas画一个小的loading界面

10分钟,利用canvas画一个小的loading界面的更多相关文章

  1. 利用canvas画一个实时时钟

    先放一张效果图: 下面是源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  2. 1.利用canvas画一个太极图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Android利用canvas画各种图形

    Android利用canvas画各种图形(点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形) 本文链接:https://blog.csdn.net/rhljiayou/article/det ...

  4. 用Canvas画一个刮刮乐

    Canvas 通过 JavaScript 来绘制 2D图形.Canvas 是逐像素进行渲染的.开发者可以通过javascript脚本实现任意绘图.Canvas元素是HTML5的一部分,允许脚本语言动态 ...

  5. 深夜,用canvas画一个时钟

    深夜,用canvas画一个时钟 查看demo 这几天准备阿里巴巴的笔试,可以说已经是心力交瘁,自从阿里和蘑菇街的内推被刷掉之后,开始越来越怀疑起自己的能力来,虽然这点打击应该是微不足道的.毕竟校招在刚 ...

  6. 用canvas画一个的小画板(PC端移动端都能用)

    前言 本篇的内容主要包括: canvas标签简介 画板的功能简介 画板的JS部分(包括:1.获取画布 2.使画板全屏幕显示且自适应 3.如何绘制直线 4.绘画时的三种状态(鼠标点击.移动.离开)5.画 ...

  7. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .

    1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...

  8. Android利用canvas画各种图形 及Paint用法 .

    引自:http://blog.csdn.net/carlfan/article/details/8139984 1.首先说一下canvas类: Class Overview The Canvas cl ...

  9. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

随机推荐

  1. Kail Linux渗透测试教程之Recon-NG框架

    Kail Linux渗透测试教程之Recon-NG框架 信息收集 信息收集是网络攻击最重要的阶段之一.要想进行渗透攻击,就需要收集目标的各类信息.收集到的信息越多,攻击成功的概率也就越大.本章将介绍信 ...

  2. manacher算法求最长回文子序列

    一:背景 给定一个字符串,求出其最长回文子串.例如: s="abcd",最长回文长度为 1: s="ababa",最长回文长度为 5: s="abcc ...

  3. stl upper_bound()

    http://blog.csdn.net/niushuai666/article/details/6734650   upper_bound( a , b , k )返回有序升序序列[a,b)中能放下 ...

  4. 某DP题目5

    题意 一个游戏里有k种装备,一开始等级为1,每打败一个怪兽,会随机掉落一件一种类型的装备,它的等级为[1,t+1]中的随机一个数,t为当前佩戴的类型的装备的等级,若掉落t+1等级的装备,就会佩戴该装备 ...

  5. [转]安卓虚拟机启动后报错: 类似 SDK Manager] Error: Error parsing .devices.xml 解决方案

    昨天用android sdk manager 更新了android sdk, 我是在myeclipse上面安装adt来开发android的现在每次打开myeclipse都报错, 而且我每次打开虚拟机的 ...

  6. Codeforces Beta Round #8 A. Train and Peter KMP

    A. Train and Peter 题目连接: http://www.codeforces.com/contest/8/problem/A Description Peter likes to tr ...

  7. CDOJ 1307 ABCDE 前缀和优化dp

    ABCDE 题目连接: http://acm.uestc.edu.cn/#/problem/show/1307 Description Binary-coded decimal (BCD) is a ...

  8. Scala入门:从HelloWorld开始【源码及编译】

    最近在学习Scala语言,虽然还没有完全学通, 但是隐约可以体会到Scala的简洁和强大. 它既能让程序员使用函数式编程, 也提供了全面的面向对象编程. 在刚刚开始读<Scala编程>的时 ...

  9. JQ自定义下拉列表插件

    自从上次做了JQ自定义分页插件和表格插件后,就没在自定义过插件了,这一个月都在用linq和ef,基本前端都没怎么去碰了,今天有个同事说有个项目需要在下拉框里面带有复选框,本来想网上找下插件的,一想,其 ...

  10. OpenCV2马拉松第12圈——直方图比較

    收入囊中 使用4种不同的方法进行直方图比較 葵花宝典 要比較两个直方图, 首先必需要选择一个衡量直方图相似度的对照标准.也就是先说明要在哪个方面做对照. 我们能够想出非常多办法,OpenCV採用了下面 ...