Canvas

一、初识canvas

  • canvas画布默认宽高是 300 * 150 px

  • canvas宽高要使用canvas标签的属性设置,不能使用css设置

  • 绘图基本步骤:

    // 获取canvas画布
    var cas = document.getElementById('cas');
    // 获取绘图工具
    var ctx = cas.getContext('2d');
    // 设置绘图起始位置
    ctx.moveTo(10,10);
    // 绘制路径
    ctx.lineTo(100,100);
    // 描边
    ctx.stroke();
    

二、绘制图形

  • 路径的绘制

    • 描边 stroke()
    • 填充 fill()
    • 既描边又填充 stroke() 和 fill()
  • 绘制曲线

    onload = function(){
        var cas = document.getElementById('cas');
        var ctx = cas.getContext('2d');
        
        ctx.moveTo(0,0);
        for (var i = 0; i < 1000; i++) {
            var x = i;
            var y = Math.sqrt(x);
            ctx.lineTo(x,y)
        }
        ctx.stroke();
    }
    
  • 手动闭合与closePath()闭合路径

    • 手动闭合,如果线的宽度比较大的话,会明显缺角,补上这个缺角可以多加一个点。
    • closePath闭合路径可以省略最后一条线。
  • 非零环绕原则:

    从闭合的区域中划出一条线,这条线经过的线条中,如果正向与反向的条数相等就不填充,否则就填充。

  • beginPath() 开启新的路径

三、绘制图形样式设置

  • lineWidth 线宽,默认1px
  • lineCap 线末端类型:(butt默认)、round、square
  • lineJoin 相交线的拐点 miter(默认)、round、bevel
  • strokeStyle 线的颜色
  • fileStyle 填充颜色
  • setLineDash() 设置虚线
  • getLineDash() 获取虚线宽度集合
  • lineDashOffset 设置虚线偏移量(负值向右偏移)

四、渐变色的绘制

onload = function(){
    var cas = document.getElementById('cas');
    var ctx = cas.getContext('2d');

    ctx.lineWidth = 30;
    
    for (var i = 0; i < 255; i++) {
        ctx.beginPath();
        ctx.moveTo(100 + i,100);    //在beginPath的时候必须重新moveTo设置新的起点
        ctx.strokeStyle = 'rgb(0,'+i+',0)';
        ctx.lineTo(100 + i + 1,100);
        ctx.stroke();
    }
    
}

五、save()和restore()的作用

  • save可以保存多个状态(用栈的方式存储:后进先出)
  • restore可以恢复上次保存的状态

六、绘制矩形

  • rect(x,y,w,h) 没有独立路径

    ctx.rect(100,100,200,200);
    ctx.stroke();
    
  • strokeRect(x,y,w,h) 有独立路径,不需要显式的进行描边操作,不影响别的绘制

    ctx.strokeRect(100,100,200,200);
    
  • fillRect(x,y,w,h) 有独立路径,不需要显式的进行填充操作,不影响别的绘制

    ctx.fillRect(100,100,200,100);
    
  • clearRect(x,y,w,h) 擦除矩形区域

    ctx.clearRect(0,0,cas.width,cas.height);  //清空画布
    

七、绘制圆弧

  • 弧度:1度等于Math.PI/180弧度。

  • 角度转换为弧度:

    function angleToRadian(angle){
        return angle * Math.PI/180;
    }
    
  • arc()

    • x 圆心横坐标
    • y 圆心纵坐标
    • r 半径
    • startAngle 开始角度
    • endAngle 结束角度
    • anticlockwise 是否逆时针方向绘制(默认false表示顺时针;true表示逆时针)
    ctx.arc(100,100,100,0,angleToRadian(90),false);
    

八、逐帧动画

onload = function(){
    var cas = document.getElementById('cas');
    var ctx = cas.getContext('2d');
    
    var xspeed = 5;
    var yspeed = 5;
    var x = 0;
    var y = 0;
    var xDirection = 1;
    var yDirection = 1;

    // 逐帧动画(序列帧动画)
    setInterval(function(){
        // 清空画布
        ctx.clearRect(0,0,cas.width,cas.height);
        if(x < 0 || x > cas.width - 200){
            xDirection = -xDirection;
        }
        if(y < 0 || y > cas.height - 100){
            yDirection = -yDirection;
        }
        x = x + xspeed * xDirection;
        y = y + yspeed * yDirection;
        ctx.fillRect(x,y,200,100);
    },100);
}

九、绘制文本

  • font:设置字体样式

    ctx.font = '20px 微软雅黑';
    
  • strokeText()

  • fillText(text,x,y,maxWidth)

    • text 要绘制的文本
    • x,y 文本绘制的坐标(文本左下角)
    • maxWidth 设置文本最大宽度,可选参数
  • ctx.textAlign文本水平对齐方式,相对绘制坐标来说的

    • left
    • center
    • right
    • start 默认
    • end
    • direction属性css(rtl ltr) start和end于此相关
      • 如果是ltr,start和left表现一致
      • 如果是rtl,start和right表现一致
  • ctx.textBaseline 设置基线(垂直对齐方式 )

    • top 文本的基线处于文本的正上方,并且有一段距离
    • middle 文本的基线处于文本的正中间
    • bottom 文本的基线处于文本的证下发,并且有一段距离
    • hanging 文本的基线处于文本的正上方,并且和文本粘合
    • alphabetic 默认值,基线处于文本的下方,并且穿过文字
    • ideographic 和bottom相似,但是不一样
  • measureText() 获取文本宽度obj.width

十、绘制图片

  • 三个参数drawImage(img,x,y)
    • img 图片对象、canvas对象、video对象
    • x,y 图片绘制的左上角
  • 五个参数drawImage(img,x,y,w,h)
    • img 图片对象、canvas对象、video对象
    • x,y 图片绘制的左上角
    • w,h 图片绘制尺寸设置(图片缩放,不是截取)
  • 九个参数drawImage(img,x,y,w,h,x1,y1,w1,h1)
    • img 图片对象、canvas对象、video对象
    • x,y,w,h 图片中的一个矩形区域
    • x1,y1,w1,h1 画布中的一个矩形区域

十一、变换

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

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,686评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,942评论 3 40
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,517评论 0 4
  • 神奇且强大的canvas 一.Canvas的基本介绍 1.什么是Canvas 定义:是HTML5提供的一种新标签,...
    Ainy尘世繁花终凋落阅读 10,787评论 1 18
  • canvas基本标签 < /canvas>宽高写在内部跟样式有区别的(样式设置-画出的图形宽高改变,内部设置-画出...
    闫子扬阅读 453评论 0 0