此文来自: 马开东云搜索 转载请注明出处 网址: http://m.makaidong.com

此文原标题: canvas学习总结四:绘制虚线 来源网址: http://m.makaidong.com/beevesnoodles/35089_6022557.html

ctx.setLineDash(segments);

参数 segments:

一个Array数组。

一组描述交替绘制线段和间距(坐标空间单位)长度的数字。

如果数组元素的数量是奇数, 数组的元素会被复制并重复。例如, [5, 15, 25] 会变成 [5, 15, 25, 5, 15, 25]。

这里最后一句话有可能我们没有看明白,没关系我们继续往下看。

我们先绘一条简单的虚线

function drawDashed(){cxt.lineWidth = 4;cxt.strokeStyle = 'green';cxt.beginPath();cxt.setLineDash([5, 15]);cxt.moveTo(20, 20);cxt.lineTo(400, 20);cxt.stroke();
}

因此绘制虚线也是非常简单,我们试着改变setLineDash()方法的参数看看结果有什么不同

function drawDashed(){cxt.lineWidth = 4;cxt.strokeStyle = 'green';cxt.beginPath();cxt.setLineDash([5]);cxt.moveTo(0, 60);cxt.lineTo(400, 60);cxt.stroke();cxt.lineWidth = 4;cxt.strokeStyle = 'red';cxt.beginPath();cxt.setLineDash([]);cxt.moveTo(0, 100);cxt.lineTo(400, 100);cxt.stroke();
}

从这个例子我们可以看出当我们的参数数组只有一个元素时我们的 “线段与间隔” 是相等的,当参数数组的元素为空时,我们绘制的是一条实线。

我们在来看几个例子

function drawDashed(){cxt.lineWidth = 4;cxt.strokeStyle = 'blue';cxt.beginPath();cxt.setLineDash([20, 5]);cxt.moveTo(20, 40);cxt.lineTo(380, 40);cxt.stroke();cxt.strokeStyle = 'green';cxt.beginPath();cxt.setLineDash([10, 20, 30]);cxt.moveTo(20, 80);cxt.lineTo(380, 80);cxt.stroke();cxt.strokeStyle = 'red';cxt.beginPath();cxt.setLineDash([10, 20, 30, 40]);cxt.moveTo(20, 120);cxt.lineTo(380, 120);cxt.stroke();
}

有上图几个例子我们可以看出,setLineDash()方法是根据参数中的元素在 “线段与间隔” 之间形成组,然后进行循环,进而绘制出虚线。

但是第二个例子当中我们传入的参数的元素个数是基数,看起来和参数元素为偶数时有点区别,它会复制元素并重复,

这就是我们开始所说的 如果参数 segments元素的数量是奇数, 数组的元素会被复制并重复。[10, 20, 30] 会变成 [10, 20, 30, 10, 20, 30]。

getLineDash 方法

有setLineDash的方法去设置虚线的线段与间距,相应的有个方法是获取虚线的线段和间距的方法。

ctx.getLineDash()

该方法返回一个 Array数组。一组描述交替绘制线段和间距(坐标空间单位)长度的数字。如果数组元素的数量是奇数,数组元素会被复制并重复。 例如, 设置线段为 [5, 15, 25] 将会得到以下返回值 [5, 15, 25, 5, 15, 25]。

var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.setLineDash([5, 15]); ctx.beginPath(); ctx.moveTo(0,100); ctx.lineTo(400, 100); ctx.stroke();
console.log(ctx.getLineDash()); // [5, 15]

扩展CanvasRenderingContext2D  绘制虚线

我们不仅可以利用 canvas API 绘制虚线,我们还可以扩展一个自己绘制虚线的方法。
扩展思路:
1. 获取起点坐标
2. 计算虚线的总长度,计算虚线包含多少短线然后循环绘制

话不多说,我们直接上代码

var canvas = document.getElementById('canvas');
var cxt = canvas.getContext('2d');
var moveToFunction = CanvasRenderingContext2D.prototype.moveTo;
CanvasRenderingContext2D.prototype.moveToLocation = {};
// 重新定义moveTo方法
CanvasRenderingContext2D.prototype.moveTo = function (x, y){this.moveToLocation.x = x;this.moveToLocation.y = y;moveToFunction.apply(this, [x, y]);
};
CanvasRenderingContext2D.prototype.dashedLineTo = function(x, y, dashedLength){dashedLength = dashedLength === undefined ? 5 : dashedLength;var startX = this.moveToLocation.x;var startY = this.moveToLocation.y;var deltaX = x - startX;var deltaY = y - startY;var numberDash = Math.floor(Math.sqrt(deltaX*deltaX + deltaY*deltaY)/dashedLength);for(var i=0; i < numberDash; i++){this[i%2 === 0 ? 'moveTo' : 'lineTo'](startX + (deltaX/numberDash)*i, startY + (deltaY/numberDash)*i); //等同于this.moveTo(x, y)或者 this.LineTo(x, y)}this.moveTo(x, y); //连续绘制虚线时,起点从当前点开始
};
//绘制虚线
cxt.lineWidth = 3;
cxt.strokeStyle = 'green';
cxt.moveTo(20, 20);
cxt.dashedLineTo(200, 200);
cxt.dashedLineTo(300, 100, 10);
cxt.dashedLineTo(400, 300);
cxt.stroke();

总结:

我们可以通过setLineDash()方法绘制虚线,该方法会以参数的元素个数为 组 的形式去进行 循环 绘制,但是要注意传入方法是参数的元素个数。

我们还可以自定义扩展绘制虚线的方法,主要就是获取起点进而计算线段数进行循环绘制

canvas如何绘制虚线相关推荐

  1. canvas学习总结四:绘制虚线

    上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...

  2. android绘制虚线

    自定义view绘制虚线--主要是趋势图,可左右滑动. 1.drawLine 通过给Paint设置setPathEffect,然后使用canvas.drawLine来绘制虚线.会发现,在某些手机上绘制虚 ...

  3. android自定义虚线,Android自定义view的方式绘制虚线

    Android自定义view绘制虚线 最近项目中有个需求,通过自定义view的方式绘制虚线 别的不多说先看一眼效果 这个需求在我们的开发中应该是一个很常见的需求了吧,有人会说有更简单的实现方式,对,但 ...

  4. canvas高效绘制10万图形,你必须知道的高效绘制技巧

    最近的一个客户项目中,简化的需求是绘制按照行列绘制很多个圆圈.需求看起来不难,上手就可以做,写两个for循环. 原始绘制方法 首先定义了很多Circle对象,在遍历循环中调用该对象的draw方法.代码 ...

  5. 一个绘制虚线的非常规函数(常规方法,打印机上绘制不出虚线)

    昨天碰到一个灰常的,郁闷之极的问题!在打印机上,竟然使用Delphi的常规方式绘制虚线的时候,竟然显示的始终是实线. 我们常规绘制虚线的方法很简单的,就是指定Canvas的PenStyle为虚线模式就 ...

  6. Flutter绘制虚线的方法

    Flutter 自带的 Canvas 并没有 Android 中的 Canvas 那么强大,连虚线都不支持. 今天周日,下午抽时间写了两个 Canvas 扩展函数,实现了绘制虚线线段和虚线矩形. 效果 ...

  7. 用html5的canvas画布绘制贝塞尔曲线

    查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  8. 【Android 应用开发】Canvas 精准绘制文字 ( 文本边界坐标解析 | 绘图位置 )

    文章目录 一.文本边界坐标解析 二.绘图位置 一.文本边界坐标解析 在上一篇博客 [Android 应用开发]Canvas 精准绘制文字 ( 测量文本真实边界 | 将文本中心点与给定中心点对齐 ) 中 ...

  9. 【Android 应用开发】Canvas 精准绘制文字 ( 测量文本真实边界 | 将文本中心点与给定中心点对齐 )

    文章目录 一.测量文本真实边界 二.将文本中心点与给定中心点对齐 一.测量文本真实边界 Paint.getTextBounds() 函数原型如下 : public class Paint {/*** ...

最新文章

  1. php如何检测数组是否存在,php – 如何检查数组元素是否存在?
  2. 网络和计算机管理制度,网络和计算机使用管理制度
  3. 【Android】将Xamarin For VS升级为4.0.1.145版
  4. Java8 中用法优雅的 Stream,性能也优雅吗?
  5. [Java基础]SimpleDateFormat类基础
  6. Android 进程监控(top命令)
  7. 数据结构 - 队列(图解+源码)
  8. 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程
  9. 从背包问题优化详解动态规划思想
  10. c++ winpcap开发(9)
  11. android id 重名_android - 解决“应用自定义权限重名”
  12. error page怎么解决_Firefox 登录feedly时出现PR_CONNECT_RESET_ERROR的解决方案
  13. JAVA Swing GUI设计 WindowBuilder Pro Container使用大全6——JLayeredPane使用
  14. 汶川地震《生死不离》歌词
  15. GDAL库读取Envisat ASAR数据
  16. Windows核心编程_重绘ListBox样式(仿QQListBox)
  17. 大学计算机专业高考听力,2018北京高考英语听力一年两考,其他省市如何进行?...
  18. linux--服务器降频
  19. python获取当前系统的日期_Python获取当前日期时间
  20. 不知道用什么软件可以测试电路,自制电器维修检测工具

热门文章

  1. 使用阿里巴巴图标库生成iconfont字体图标
  2. 正在使用赶牛! 赶牛,中国股民的微博客
  3. 空洞卷积感受野大小计算
  4. 产品经理撰写需求文档
  5. win python 判断 所有 子进程 结束_python 多进程如何终止或重启子进程?
  6. HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)
  7. PADS VX2.8 敷铜自动倒角的使用方法
  8. air换电池 macbook_macbook怎么换电池?macbook换电池图文教程
  9. 设计模式:策略模式+观察者模式
  10. c语言赛车游戏代码大全,初学者天地游戏制作--赛车游戏的完整图