Canvas学习

基本使用:
1.Canvas 标签. 默认 300 * 150 的区域
2.利用 html 属性为它设置宽高. 不要使用 CSS 来设置.

使用 属性设置 canvas 标签的宽高, 实际上相当于增加了 canvas 画布的像素
但是如果使用 CSS 来设置画布的大小, 那么不会增加像素点, 只是将像素扩大了

3.Canvas 只能展示绘图的内容. 但是不能进行绘图
使用语法 canvas.getContext( ‘2d’ ) 就返回一个在当前画布上绘图的工具集
4.开始绘图,绘图的基本方法:

  • 移动到开始位置
    • moveTo(x,y)
  • 开始画线条
    • lineTo(x,y)
  • 描边显示
    • stroke()
  • 描边颜色:.strokeStyle = ‘颜色’: 描边之前设置颜色
  • 描边宽度:.lineWidth = 数值
  • 闭合路径:.closePath(),可以省去最后一条边的绘
  • 清除路径.beginPath();为了放置重绘
  • 填充:.fill() 不定义填充,定义填充颜色也不起作用
  • 填充颜色.fillStyle = ‘颜色’
  • 如果先填充后描边,描边宽度正常
  • 先描边,后填充,描边宽度会显示一半
  • 非零环绕原则:判断哪些区域属于路径内
a)  在路径包围区域中,早一点没想外发射一条射线
b)  和所有环绕他的边相交
c)  开启一个计数器,从0计数
d)  如果这个设下遇到顺时针环绕,+1
e)  遇到逆时针环绕-1
f)  计算结果非0,即在路径内
  • 先填充,后描边,才能显示设置的宽度
  • 线帽样式:.lineCap =
a)  butt(默认值)
b)  round:圆头,半径为线宽的一半
c)  square:方头(各突出线宽的一半)
  • 交点样式:.lineJoin =
a)  miter:默认尖角
b)  round:圆角
c)  bevel:平角’
  • 画一条矩形路径:.rect(starX,starY,width,height)
    • 只是路径,要在后面描边stroke();
  • 绘制一个描边矩形:strokeRect(starX,starY,width,height)
  • 绘制一个填充矩形:fillRect(starX,starY,width,height)
  • 清除画布.clearRect(starX,starY,width,height)
  • setLineDash([实线长度,虚线长度])
  • getLineDash()获取如何设置的线条规则
  • lineDashOffset = 3 偏移量

画弧
- arc(圆心X坐标,圆心Y坐标,半径,起点弧度,结束点弧度,[是否逆时针画])
- arc会从上次的结束点到弧的开始点之间画条直线

文字API
- strokeText(文字,参考X坐标,参考Y坐标[,限制文字最大长度])
- font = ‘加粗 字号/行高 字体’:设置字体样式
- a) 单独设置字号不可以,必须加字体样式才会生效

  • fillText(文字,参考X坐标,参考Y坐标[,限制文字最大长度])
  • textAlign = ‘left/right/start’对齐方式
  • textBaseline = ‘top/middle/bottom/默认基线(alphabetic)

绘制图像
- drawImage()

a)  三种使用方式
1.  三个参数
a)  .drawImage(获取标签,坐标X,坐标Y)
b)  img.onload = function(){}:img加载完毕之后触发
2.  五个参数:把图片放置到指定位置,并指定宽高
a)  .drawImage(获取标签,坐标X,坐标Y,width,height)
3.  九个参数:把裁剪后的图片放到指定的位置,并且知道大小
a)  .drawImage(获取标签,裁剪图片的位置X, 裁剪图片的位置Y, 裁剪图片的width, 裁剪图片的height,坐标X,坐标Y,width,height)
  • save();状态保存
    • a) 把当前的状态(绘制环境的所有属性)复制一份保存
  • restora();状态回滚

状态的保存与回滚

a)  把最近保存的一次状态作为当前状态
b)  回滚一次会把上次保存的属性删除
1.  再回滚会拿到上次保存的属性
c)  可多次回滚,依次往回找保存的属性

平移,旋转,缩放
- translate(X平移的量,Y轴平移的量)
- rotate(旋转的弧度)
- scale(X轴缩放比值,Y轴缩放比值)
- 角度转弧度:Math.PI / 180 * deg (deg是要转换的角度)

var s  =  Math.floor( Math.randow() * (max-min+1) + min ); //生成min-max之间的随机数

基本饼形图

var arc = {};
arc.toAngle = function (radian) {
    return radian*180/Math.PI;
};
arc.toRadian = function (angle) {
    return angle*Math.PI/180;
};
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        canvas{
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <canvas width=600 height=600></canvas>
</body>
<script src="../Angle-radian.js"></script>
<script>
    var cas  = document.getElementsByTagName("canvas")[0];
    var ctx = cas.getContext("2d");
    var x0 =cas.width/2;
    var y0 =cas.height/2;
    var radius =100;
    var colors = "red,blue,green,pink".split(",");
    var startAngle = -90;
    var data = [12,23,48,24];
    var sum =0;
    var data2 ;
    data.forEach(function (v) {
        sum+=v;
    });
   data2 = data.map(function (v) {
        return {value:v,angle:v*360/sum}
    });
//    console.log(data2);
    var oldAngle = null,
        textAngle = null,
         textX,
         textY;
    data2.forEach(function (v, i) {
        ctx.beginPath();
        ctx.moveTo(x0,y0);
        oldAngle = startAngle;
        textAngle = oldAngle + v.angle/2;
        ctx.arc(x0,y0,radius,arc.toRadian(startAngle),arc.toRadian(startAngle+= v.angle));
        ctx.fillStyle = colors[i];
        ctx.fill();

//        开启文字路径
        ctx.beginPath();
//        定位
        textX = x0+(radius+20)*Math.cos(arc.toRadian(textAngle));
        textY = y0+(radius+20)*Math.sin(arc.toRadian(textAngle));
//        绘制底线
        ctx.moveTo(textX,textY);
        ctx.lineTo((textX+20*Math.cos(arc.toRadian(textAngle))),(textY+20*Math.sin(arc.toRadian(textAngle))));
        ctx.lineTo(textX<(textX+20*Math.cos(arc.toRadian(textAngle)))?(30+textX+20*Math.cos(arc.toRadian(textAngle))):(textX+20*Math.cos(arc.toRadian(textAngle)))-30,(textY+20*Math.sin(arc.toRadian(textAngle))));
        ctx.strokeStyle = colors[i];
        ctx.stroke();
//        绘制文字
//        设置字体的样式
        if(textAngle>90&&textAngle<270){
            ctx.textAlign = "right";
        }
        ctx.font="20px 黑体";
        ctx.fillText(""+(v.angle/360*100).toFixed(0)+"%",textX+20*Math.cos(arc.toRadian(textAngle)),textY+20*Math.sin(arc.toRadian(textAngle))-10);

    });

</script>
</html>

上面的代码写的太多繁杂,这里可以使用Konva框架帮助我们完成基本图形的绘制。
常用的图像框架有很多:

KonvaJS
百度的 echarts
D3.js
webgl 引擎

konva的基本理念:

任何图形都存在于舞台中( Konva.Stage ). 这个舞台中又可以包多个用户层( Konva.Layer ).

每一个层中都含有两个 <canvas> 着色器: 一个前台渲染器, 一个后台渲染器. 前台渲染器是可以看见的部分, 而后台渲染器是一个隐藏的 canvas. 后台渲染器为了提高效率实现事件监听的工作.

每一个层可以包含形状( Shape ), 形状的组( Group ), 甚至是由组组成的组. 舞台, 层, 组, 以及形状都是虚拟的节点( node ). 类似于 HTML 页面中的 DOM 节点.

konva的基本使用:

需要引入 Konva.js 文件
<script src="konva.js"></script>
然后页面中放置一个容器作为 Konva 处理的对象. Konva 会在该容器中添加 canvas 标签. 值得说明的是, 需要为这个标签添加 id 属性.
<div id="dv"></div>
然后编写 js 代码. Konva 是一个完全面向对象的库.
创建舞台
var stage = new Konva.Stage({
 container: 'dv',
 width: window.innerWidth,
 height: window.innerHeight
});
//舞台中可以放置一个到多个层( Layer ), 所有的图形应该放在在层中.
//首先创建层对象. 层对象不需要传递参数.
var layer = new Konva.Layer();
//将层添加到舞台中. Konva 中凡是添加, 都是使用 add 方法.
stage.add( layer );
//在层中放置一个矩形, 就创建一个 矩形对象.
var rect = new Konva.Rect({
x: 100,
y: 50,
width: 200,
height: 100,
fill: 'red'
});
//Konva 中添加颜色使用 fill 属性和 stroke 属性, 分别表示填充颜色与描边颜色.
//将矩形添加到 层中
layer.add( rect );
//最后绘图使用 draw 方法
layer.draw();

只是简单记录下使用的理念和方法,具体的API就查看官网。

### HTML5 Canvas 学习教程 HTML5 中的 `<canvas>` 元素提供了一种通过脚本绘制图形的方式,支持动态渲染位图图像、形状、文本以及动画等功能。以下是关于学习 HTML5 Canvas 的一些核心知识点和示例。 #### 1. 创建并初始化 Canvas 元素 要在 HTML 页面中引入 `<canvas>` 元素,可以按照以下方式定义其宽度和高度属性[^2]: ```html <canvas id="myCanvas" width="800" height="400"></canvas> ``` 接着,在 JavaScript 中获取该元素及其上下文对象以便后续操作: ```javascript const canvas = document.getElementById(&#39;myCanvas&#39;); if (!canvas.getContext) { console.error("无法加载 Canvas 上下文"); } else { const ctx = canvas.getContext(&#39;2d&#39;); // 获取 2D 渲染环境 } ``` #### 2. 基础绘图功能 利用 `ctx` 对象提供的方法可实现多种基础绘图操作,例如线条、矩形、圆形等[^3]。 ##### 绘制直线 下面展示如何画一条从左上角延伸至右下角的对角线: ```javascript ctx.beginPath(); // 开始新路径 ctx.moveTo(0, 0); // 设置起点坐标 ctx.lineTo(canvas.width, canvas.height); // 定义终点位置 ctx.stroke(); // 执行描边命令完成绘制 ``` ##### 添加填充颜色的矩形区域 此代码片段用于生成带有指定背景色的一个封闭框体结构: ```javascript ctx.fillStyle = &#39;#FFA500&#39;; // 设定内部填充色彩样式 ctx.fillRect(50, 50, 150, 100);// 参数依次代表x,y,w,h即距离左边距顶部偏移量宽高数值单位像素点数 ``` #### 3. 高级特性探索 随着技能提升还可以尝试更多高级技术应用比如渐变效果阴影设置等等[^1]。 ##### 应用径向梯度作为背景图案 这里介绍一种创建由中心向外扩散变化色调的方法论实例演示过程如下所示: ```javascript // Define the gradient var grd = ctx.createRadialGradient(75,50,5,90,60,100); grd.addColorStop(0,"red"); grd.addColorStop(1,"white"); // Fill with gradient ctx.fillStyle = grd; ctx.fillRect(10,10,150,80); ``` #### 结语 上述内容仅涵盖了部分基础知识要点供初学者入门参考之用;实际开发过程中还需要不断练习积累经验才能熟练运用这些工具创造出更加精美复杂的视觉作品出来[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值