canvas 从ondraw中获取_canvas

canvas基础

   canvas简述

canvas是html5新增的一个标签,使用都是依赖于js语法,不依赖任何第三方插件  ie低版本暂不支持

   canvas的基本使用步骤:

1:先在body中设置一个容器

 id='canvas'>

 在这里显示canvas绘制的图形

默认的宽是300px  高150px   不能使用css去设置宽高 可以直接在标签中设置或者js设置宽高

2:在javascript中

 2.1获取canvas标签对象---通过id名去获取

 var canvas = document.getElementById('canvas')  

2.2  获取画笔对象的上下文 | 画布的上下文对象  var ctx=canvas.getContext('2d')

2.3绘制一个矩形---表示初始坐标(10,10)宽100高50

   ctx.rect(10,10,100,50)

   ctx.moveTo(100,100)--- //起始点

   ctx.fill()   //填充    

   ctx.stroke()  //描边--写在最后面

canvas默认的填充颜色和边框颜色均为黑色,可以自定义设置相关的样式:

   关于颜色的设置-- 同css中颜色设置一样--一定在填充或者描边之前设置颜色

 fillStyle  填充颜色属性--

 strokeStyle描边颜色属性

如:ctx.fillStyle='red';  

     ctx.strokeStyle='yellow';

线条样式的设置:

 Linejoin   拐角设置  ---round圆角  miter   bevel

LineCap  线条两端的设置 butt  默认  round圆角 square加了一个正方形的帽

LineWidth线宽---数字

开启路径和关闭路径:

ctx.beginPath()  

绘制路径图形  moveTo  LineTo rect arc

先开启路径,相当于开辟了一个开启路径私有空间,绘制的内容就不会互相影响

但是画笔的linewidth  fillStyle strokeStyle    Linejoin LineCap  都是全局的

ctx.closePath()  关闭路径  不需要手动闭合 会自动将末尾的点和起始点连接闭合

402b438a0281a788732bd04d1aa35345.png

时钟案例:

main.js部分:

let dom = document.getElementById('clock');

let ctx = dom.getContext('2d');

let width = ctx.canvas.width;

let height = ctx.canvas.height;

var r = width / 2;

//为了宽度高度放大是时,其他边框等比美观,所以设置一个比例

var rem = width / 200;

function drawBackground() {

    ctx.save();

    ctx.translate(r, r);

    ctx.beginPath();  //每次开始前必须开始一条路径

    //按比例输出边框宽度,width/200=x/10=rem; 即 x=10 *rem

    ctx.strokeStyle = 'lightblue'

    ctx.lineWidth = 5 * rem;

    ctx.arc(0, 0, r - ctx.lineWidth / 2, 0, 2 * Math.PI, false);

    ctx.stroke();    

var hourNumbers = ['Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ', 'Ⅺ', 'Ⅻ'];

    hourNumbers.map(function (number, i) {

        var rad = 2 * Math.PI / 12 * i;

        var x = Math.cos(rad) * (r - 30 * rem);

        var y = Math.sin(rad) * (r - 30 * rem);

        ctx.textAlign = 'center';

        ctx.textBaseline = 'middle';

        ctx.font = 10 * rem + "px Arial";

        ctx.fillText(number, x, y)

    });

    for (var i = 0; i < 60; i++) {

        var rad = 2 * Math.PI / 60 * i;

        var x = Math.cos(rad) * (r - 18 * rem);

        var y = Math.sin(rad) * (r - 18 * rem);

        ctx.beginPath();

        if (i % 5 === 0) {

            ctx.fillStyle = '#000';

        } else {

            ctx.fillStyle = '#ccc';

        }

        ctx.moveTo(x, y,)

        ctx.arc(x, y, 2 * rem, 2 * Math.PI, false);

        ctx.fill();

    }

}

function drawHour(hour, minute) {

    ctx.save();

    ctx.beginPath();

    var rad = 2 * Math.PI / 12 * hour;

    var mrad = 2 * Math.PI / 12 / 60 * minute;

    ctx.rotate(rad + mrad);

    ctx.lineWidth = 6 * rem;

    ctx.moveTo(0, 10 * rem);

    ctx.lineTo(0, -r / 2);

    ctx.lineCap = 'round';

    ctx.stroke();

    ctx.restore();

}

function drawMinute(minute) {

    ctx.save();

    ctx.beginPath();

    var rad = 2 * Math.PI / 60 * minute;

    ctx.rotate(rad);

    ctx.lineWidth = 3 * rem;

    ctx.moveTo(0, 10 * rem);

    ctx.lineTo(0, -r / 2 - 10);

    ctx.lineCap = 'round';                             

    ctx.stroke();

    ctx.restore();

}

function drawSecond(second) {

    ctx.save();

    ctx.beginPath();

    var rad = 2 * Math.PI / 60 * second;

    ctx.rotate(rad);

    ctx.lineWidth = 3;

    ctx.moveTo(-2 * rem, 20 * rem);

    ctx.lineTo(2 * rem, 20 * rem);

    ctx.lineTo(1, -r + 18 * rem);

    ctx.lineTo(1, -r + 18 * rem);

    ctx.fillStyle = '#e4393c';

    ctx.fill();

    ctx.restore();

}

function drawDot() {

    ctx.beginPath();

    ctx.fillStyle = '#fff';

    ctx.arc(0, 0, 3 * rem, 2 * Math.PI, false);

    ctx.fill();

}

function draw() {

    // 清除画布

    ctx.clearRect(0, 0, width, height);

    // 获取当前事件

    var now = new Date();

    // 获取当前的小时

    var hour = now.getHours();

    // 获取当前的分钟

    var minute = now.getMinutes();

    // 获取当前的秒钟

    var second = now.getSeconds();

    // 绘制

    drawBackground();

    drawHour(hour, minute);

    drawMinute(minute);

    drawSecond(second);

    drawDot();

    ctx.restore();

}

setInterval(draw, 1000);

渐变效果:

线性渐变:createlinearGradient

 let linearGradient = ctx.createLinearGradient(0, 0, 300, 0)

 linearGradient.addColorStop(0.2, '#ac8eff') //0-0.3 的颜色              

 linearGradient.addColorStop(0.5, '#dd8efd')    //为我们fillStyle设置为渐变色    

 linearGradient.addColorStop(0.8, '#f084fd')

  linearGradient.addColorStop(1, '#f683fc')

ctx.fillStyle = linearGradient //颜色对象赋值给当前轨迹的fillStyle              

ctx.rect(0, 0, 300, 300)

ctx.fill()

径向渐变:createRadialGradient

 let radialGradient=ctx.createRadialGradient(100, 200, 30, 80, 100, 150)

 //渐变的开始圆的坐标和半径   vs  渐变的结束圆的坐标和半径

        radialGradient.addColorStop(0.2, '#ac8eff')

        radialGradient.addColorStop(0.5, '#dd8efd')

        radialGradient.addColorStop(0.8, '#f084fd')

        radialGradient.addColorStop(1, '#f683fc')

        ctx.arc(100, 200, 60, 0, 2 * Math.PI)

        ctx.fillStyle = radialGradient

        ctx.fill()

变形:针对的是整个画布

 translate位移    rotate 旋转   scale放大

save保存变形之前的状态

restore回到保存之前的状态

c131246ffd7c2dc92bdc22defdd0354b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值