HTML5中如何绘制图表

HTML5中如何绘制图表,第1张

图表的背景一般是精心设计的它有一定的梯度、网格线、号码标签和月份名称等等,如果直接通过JavaScript进行绘制可能需数十行或上百行的代码。但是如果我们直接通过Canvas直接创建一个背景图。我们只需要在其他的软件如PS上绘制好一个背景图,然后加载到Canvas上就可以了。

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>绘制图表</title>

</head>

<body>

<div id="result-stub" class="well hidden">

<canvas id="canvas" width="345" height="345">

<p>你的浏览器不支持canvas元素</p>

</canvas>

</div>

<script>

//   1、要绘制图表首先我们要获取到canvas对象以及具有图表背景的对象。

var

canvas = documentgetElementById('canvas'),

context = null;

context = canvasgetContext('2d');

var img = new Image();

imgsrc ='chart-backgroundpng';//这里是一张具有图表背景的

//    2、绘制一个具有图表背景的后再根据要绘制的曲线图各个点在canvas是中的坐标绘制直线。

imgonload = function() {

//绘制

contextdrawImage(img, 0, 0);

//绘制直线

contextbeginPath();

contextmoveTo(70, 105);

contextlineTo(105, 132);

contextlineTo(142, 250);

contextlineTo(176, 175);

contextlineTo(212, 145);

contextlineTo(245, 197);

contextlineTo(280, 90);

contextstroke();

}

</script>

<script src="jqueryjs"></script>

</body>

</html>

3、本示例的最终绘制效果如下:这样一个曲线图表就绘制出来的,其他的图表也可以用类似的方法进行绘制。

这些都是有关于HTML5新特性的一些应用。给你推荐一个教程网站秒秒学,该网站上有关于HTML5新特性的讲解。

在实际的开发当中,我们经常会涉及到绘制路径,这里我们总结一下 Path 的常用 API 。

对于一个 Path 来说,它其中有很多的”子路径“,对于每个”子路径“,它又会有两个变量,"源点"和"当前点",也就是源码当中所描述的:

下面是 Path 当中和连线相关的方法:

每次调用完 moveTo/rMoveTo 方法,都会生成一条新的子路径,这两者的区别在于:

1 新建一条路径, (x, y) 作为这个新路径的“源点"的值,在图上不会产生新的连线。

2 相对于当前路径的"当前点"的值,移动坐标 (dx, dy) ,作为新路径的"源点",在图上不会产生新的连线。

1 从当前点位置,直线连接到绝对坐标 (x, y) ,如果没有调用过 moveTo/rMoveTo ,那么会先调用 moveTo(0, 0) 来生成一条从源点开始的子路径。

2 相对于当前点坐标,移动 (dx, dy) 作为终点坐标,并连接起点和终点。

1 从当前点位置开始,以 (x1, y1) 为控制点,按一阶贝塞尔曲线计算方法连接到 (x2, y2) ,如果之前没有调用过 moveTo/rMoveTo ,也会先调用一次 moveTo(0, 0) 方法。

2 类似于上面,只不过终点坐标是相对于当前点坐标移动了 (dx2, dy2) 后的值。

和一阶贝塞尔曲线类似,不过是多了一个控制点 (x2, y2) 。

上面这三个函数,最终都是调用了同一个方法:

它的原理就是:首先根据 RectF 或者 4 个点的坐标来确定一个矩形区域,之后得到这个矩形的内切椭圆,然后再根据 startAngle 和 sweepAngle 来确定这个内切源的一段弧,这段弧就是新绘制的路径。但是这段弧的起点很有可能和 Path 的当前点不是重合的,这时候就根据 forceMoveTo 来决定是否产生一条新的子路径,从最终的结果看,就是是否需要绘制一条从 Path 当前点到这段弧起点的连线,如果为 forceMoveTo=false ,那么就绘制这么一条直线,反之,则不绘制, forceMoveTo 的默认值为 false 。

forceMoveTo=false

forceMoveTo=true

forceMoveTo=true + pathclose()

对于这种情况,由于采用了 true 标志位,因此生成了一条新的”子路径“,所以在调用 close 方法之后,连接的是当前子路径的源点和当前点。

如果对于当前”子路径“来说,它的"当前点"和"源点"不重合,那么会绘制一条从当前点到源点的直线。

除了采用连线的方法来确定一条路径, Path 还提供了 addXXX 来直接地增加一整段的路径,下面是相关的方法:

下面是运行的结果:

关于填充类型的方法有如下这些:

关于这个 FillType 的理解,下面这篇文章的作者说的很好:

我这里只是稍微地总结一下:

我们都知道 Paint 有三种模式: FILL/FILL_AND_STROKE/STROKE ,对于 STROKE 来说,是只绘制轮廓,而两种模式都涉及到”填充“,那么”填充“就涉及到怎么定义一个 Path 所组成的图形的内部, FillType 就是用来确定这个所谓的”内部“的定义的,需要注意,只讨论封闭图形的情况。

关于 Path 的计算,有下面这两个方法:

我们以 XOR 为例子:

最后的结果为:

Path 提供了两种重置方法:

我们可以获取canvas对象为var c=documentgetElementById("myCanvas");其应有js属性方法如下列举:

1:绘制渲染对象,cgetContext("2d"),获取2d绘图对象,无论我们调用多少次获取的对象都将是相同的对象。

2:绘制方法:

clecrRect(left,top,width,height)清除制定矩形区域,

fillRect(left,top,width,height)绘制矩形,并以fillStyle填充。

fillText(text,x,y)绘制文字;

strokeRect(left,top,width,height)绘制矩形,以strokeStyle绘制边界。

beginPath():开启路径的绘制,重置path为初始状态;

closePath():绘制路径path结束,它会绘制一个闭合的区间,添加一条起始位置到当前坐标的闭合曲线;

moveTo(x,y):设置绘图其实坐标。

lineTo(x,y);绘制从当前其实位置到x,y直线。

fill(),stroke(),clip():在完成绘制的最后的填充和边界轮廓,剪辑区域。

arc():绘制弧,圆心位置、起始弧度、终止弧度来指定圆弧的位置和大小;

rect():矩形路径;

drawImage(Imag img):绘制;

quadraticCurveTo():二次样条曲线路径,参数两个控制点;

bezierCurveTo():贝塞尔曲线,参数三个控制点;

createImageData,getImageData,putImageData:为Canvas中像素数据。ImageData为记录width、height、和数据 data,其中data为我们色素的记录为

argb,所以数组大小长度为widthheight4,顺序分别为rgba。getImageData为获取矩形区域像素,而putImageData则为设置矩形区域像素;

… and so on!

3:坐标变换:

translate(x,y):平移变换,原点移动到坐标(x,y);

rotate(a):旋转变换,旋转a度角;

scale(x,y):伸缩变换;

save(),restore():提供和一个堆栈,保存和恢复绘图状态,save将当前绘图状态压入堆栈,restore出栈,恢复绘图状态;

最近在制作公司的一个项目时有运用到 canvas 与屏幕坐标互相转换的一个知识点,如果没有进行 canvas 缩放 、 旋转 、 平移 一系列 *** 作时,这个需求还是比较简单的,但是如果 *** 作复杂起来后,要再进行转换,在不知道一些特定api就显得比较困难了,在查阅了了一些资料后解决了这个需求这里分享给大家。

解决这个需求时引用了两个API,分别是 CanvasRenderingContext2DgetTransform() 、

DOMMatrixinvertSelf()

CanvasRenderingContext2DgetTransform() 可以获取当前 canvas 上下文的被应用的转换矩阵,返回 DOMMatrix 对象。

DOMMatrixinvertSelf() 可以获取当前矩阵逆转后的结果,注意这个api是会修改自身矩阵的。

我们通过这两个API可以获取当前canvas的 DOMMatrix ,然后将其逆转,通过逆转后的转换矩阵就可以获取屏幕坐标转对应的canvas坐标了。

CanvasRenderingContext2DgetTransform()

DOMMatrixinvertSelf()

可以看到兼容性还是比较良好的,如果没有要求兼容IE就放心大胆的用吧。

以上就是关于HTML5中如何绘制图表全部的内容,包括:HTML5中如何绘制图表、Canvas&Paint 知识梳理(6) - 绘制路线 Path 基本用法、怎样用canvas在网页上绘制图形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9777389.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存