今天给大家讲解的是在HTML5 canvas画带箭头的虚线。关于Canvas 对象表示一个 HTML 画布元素 -。它没有自己的行为,但是定义了一个 API 支持脚本化客户端绘图操作。

本案例注意事项:

1、当你拖动箭头时 canvas里面线条绘制自动重新计算点。

2、canvas没有画虚线的api,因为对api不是很熟悉,所以就不献丑了,在网上找的。

3、箭头出来后 点击画布里面的任意点 箭头将延伸到该处,至于具体的应用 修改canvas的lineTo属性就能实现了。

4、具体的代码解释我写的比较清楚,修改箭头样式只需写过lineTo即可,非常简单。

效果如下:

请点击:canvas画带箭头的虚线 下载本实例相关素材及源码

代码如下:

HTML Canvas Dotted Lines

body { background:#ddd; text-align:center; }

canvas { margin:2em auto; display:block; border:1px solid #666; }

label { padding-right:2em }

Line Width:

Dashes/Gaps:

Line Cap: buttroundsquare

if (window.CanvasRenderingContext2D && CanvasRenderingContext2D.prototype.lineTo){

CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){

if (!dashArray) dashArray=[10,5];

var dashCount = dashArray.length;

this.moveTo(x, y);

var dx = (x2-x), dy = (y2-y);

var slope = dy/dx;

var distRemaining = Math.sqrt( dx*dx + dy*dy );

var dashIndex=0, draw=true;

while (distRemaining>=0.1 && dashIndex<10000){

var dashLength = dashArray[dashIndex++%dashCount];

if (dashLength==0) dashLength = 0.001; // Hack for Safari

if (dashLength > distRemaining) dashLength = distRemaining;

var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) );

x += xStep

y += slope*xStep;

this[draw ? 'lineTo' : 'moveTo'](x,y);

distRemaining -= dashLength;

draw = !draw;

}

// Ensure that the last segment is closed for proper stroking

//this.moveTo(0,0);

}

}

var c = document.getElementsByTagName('canvas')[0];

c.width = 800; c.height = 600;

var defaultX = 350, defaultY = 350;

function drawArr(x, y){

//值初始化,default用于页面没有点击的时候初始化。

var x, y, arr;

if(0 == arguments.length) {

x = 667;

y= 470;

}

else {

x = x;

y= y;

}

var ctx = c.getContext('2d');

ctx.strokeStyle = 'black';

//这3个是用来获取页面的自动设置配置。

var width = document.getElementById('width');

var linecap = document.getElementById('linecap');

var dashes = document.getElementById('dashes');

//这个是核心用来画每个线段。

var drawDashes = function(){

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

var dashGapArray = dashes.value.replace(/^\s+|\s+$/g,'').split(/\s+/);

if (!dashGapArray[0] || (dashGapArray.length==1 && dashGapArray[0]==0)) return;

ctx.lineWidth = width.value;

ctx.lineCap = linecap.value;

ctx.beginPath();

ctx.fillStyle = "#8BC54B";

ctx.strokeStyle = 'rgb(0, 0, 100)'

//开始画虚线。

//当 x > 起始点的x坐标(即点击点 在起始点的右边)的时候 不需要 改变这4个坐标,但是当x < 起始点的X坐标(点击点在起始点左边的时候)需要改变这4个坐标的位置

if(x > defaultX) {

ctx.dashedLine(defaultX, defaultY, x, y, dashGapArray );

}

else {

ctx.dashedLine(x, y, defaultX, defaultY, dashGapArray );

}

//虚线画完了开始画箭头的4个线段

//计算4个点的坐标

arr = jisuan(x, y);

//设定开始点。

ctx.moveTo(arr[0],arr[1]);

ctx.lineTo(x,y)

ctx.lineTo(arr[2],arr[3]);

//下面这个计算是用来在箭头与虚线的交叉点。直角三角形计算原理。。

ctx.lineTo(x-parseInt(25*Math.cos(arr[4]*Math.PI/180)), y-parseInt(25*Math.sin(arr[4]*Math.PI/180)));

ctx.lineTo(arr[0],arr[1]);

ctx.closePath();

ctx.stroke();

};

drawDashes();

width.onkeyup = drawDashes;

linecap.onchange = drawDashes;

dashes.onkeyup = drawDashes;

}

//该函数用来根据鼠标点击点 计算箭头4个点的坐标,在JS中cos和SIN都是计算的弧度,所以需要转换。至于计算方法属于属性范畴这里不累述。

//对于该函数,如果需要修改箭头的大小 只需修改 45: 箭头两边的长度; 35:箭头与中间虚线的角度即可。

function jisuan(x, y) {

var angle = parseInt(Math.atan2(y-defaultX,x-defaultY)/Math.PI*180);

var arr = [];

arr[0] = x - parseInt(45 * Math.cos(Math.PI/180*(angle - 35)));

arr[1] = y - parseInt(45 * Math.sin(Math.PI/180*(angle - 35)));

arr[2] = x - parseInt(45 * Math.cos(Math.PI/180*(angle + 35)));

arr[3] = y - parseInt(45 * Math.sin(Math.PI/180*(angle + 35)));

arr[4] = angle

return arr;

}

drawArr();

document.body.onmousedown = function(event) {

var event = event || window.event;

var mousePos = getMousePos(event);

drawArr(mousePos.x, mousePos.y);

}

getMousePos  = function(event) {

if (event.pageX || event.pageY) {

mousePos = {

x: event.pageX,

y: event.pageY

};

}

/*ie 与 ff的边界 处理不同*/

if (!+"\v1") {

mousePos = {

x: event.clientX,

y: event.clientY

}

}

else {

mousePos = {

x:event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,

y:event.clientY+document.body.scrollTop+document.documentElement.scrollTop

}

}

//return mousePos

//程序到这里就是一个标准获取页面上鼠标的坐标函数,下面的代码是因为 画布的点不是以浏览器的左上角为起始点所以需要减去多余的距离方法如下:

var pos = c.getBoundingClientRect();

mousePos.x = mousePos.x - pos.left;

mousePos.y = mousePos.y - pos.top;

return mousePos;

}

以上就是通过HTML5 canvas画带箭头的虚线的全部内容,请继续关注学无忧教程网。

html5画直线箭头,HTML5 canvas画带箭头的虚线相关推荐

  1. Android Canvas绘制带箭头的直线

    先看下效果图: 下面我们直接看代码 我自定义了一个View,代码如下: package com.davis.drawtrangle;import android.content.Context; im ...

  2. R语言使用rnorm函数生成正太分布数据、使用plot函数可视化折线图、使用arrows函数在可视化图像中绘制箭头曲线、绘制带箭头线段,可以设置箭头角度,有几个箭头(1起点箭头、2终点箭头,3双箭头)

    R语言使用rnorm函数生成正太分布数据.使用plot函数可视化折线图.使用arrows函数在可视化图像中绘制箭头曲线.绘制带箭头线段,可以设置箭头角度,有几个箭头(1起点箭头.2终点箭头,3双箭头) ...

  3. 橡皮筋画直线c 语言,canvas——橡皮筋式线条绘图应用

    什么叫橡皮筋式 指画图时橡皮筋一样伸缩自如.. 例子如下? 思路 思路很简单,只有橡皮筋式绘制功能要注意,以下总结mousedown,mousemove,mouseup三个阶段的思路 mousedow ...

  4. 橡皮筋画直线c 语言,canvas 橡皮筋式线条绘图应用方法

    什么叫橡皮筋式 指画图时橡皮筋一样伸缩自如.. 例子如下:point_down: 思路 思路很简单,只有橡皮筋式绘制功能要注意,以下总结mousedown,mousemove,mouseup三个阶段的 ...

  5. PHP画a梦,使用canvas画“哆啦A梦”时钟的代码

    这篇文章主要介绍了JavaScript学习小结之使用canvas画"哆啦A梦"时钟的相关资料,需要的朋友可以参考下 前言:今天看完了Js书的canvas画布那张,好开心~又是心爱的 ...

  6. html边框有箭头,css简单实现带箭头的边框

    css简单实现带箭头的边框 普通边框 .border { width: 100px; height: 50px; border: 1px solid red; } 实现由四个三角形组成的正方形 .tr ...

  7. html边框上的小箭头,css简单实现带箭头的边框

    css简单实现带箭头的边框 普通边框 .border { width: 100px; height: 50px; border: 1px solid red; } 实现由四个三角形组成的正方形 .tr ...

  8. html5画布画出折线图,canvas 画出动态折线图

    canvas 是 html5 支持的一个标签,用于图形的绘制.canvas 标签仅仅提供了图形的容器,必须通过 js 脚本来绘制. 比如,绘制一个简单的矩形: 矩形.png var c=documen ...

  9. html5绘制随机五角星_html5 canvas画五角星(随机生成)

    五角星的格定点坐标该如何定位?原理图如下: 源代码: function canvs_start(){ var c = document.getElementById("star") ...

  10. python 可视化 画直线_用Python画江苏省地图,实现各地级市数据可视化

    前言 万万没想到我昨天发布的用Python画中国地图,实现各省份数据可视化这篇文章获得了很多朋友的喜欢,目前已获得了66次转发,314次收藏,也让我涨了60个左右粉丝. 小嘚瑟 虽然这点成绩跟很多大V ...

最新文章

  1. ICAP: 互换客户端地址协议
  2. C#实现Access导入导出Excel
  3. java实现权重随机算法
  4. libevent c++高并发网络编程_【多线程高并发编程】Callable源码分析
  5. FilterAttribute过滤器的 执行顺序
  6. java内嵌html5浏览器_Jcef内嵌浏览器windows版本的编译及使用
  7. 2019年最新web前端笔试题
  8. sql cai bird教程学习记录
  9. 开发一个App要100万? 太扯淡
  10. 从鼠标点击位置发射射线检测是否点击到3D世界中的物体
  11. 使用PRSice进行多基因风险评分分析
  12. el-talbe如何在打印的时候,每页都能有表头?
  13. VMware Workstation中安装Windows10系统
  14. 第一批用基因编辑工具定制DNA的婴儿即将诞生?
  15. Dilworth定理的简单应用(导弹拦截题解)
  16. 咸鱼码农-java基础(一)
  17. 第七周作业:注意力机制学习的part2
  18. 人事考试在线报名系统新突破,一键触达“智慧考试”
  19. jQuery操作元素和DOM
  20. 解决新手引导图片被导航栏遮盖住得问题

热门文章

  1. 物联网通信技术期末复习7:第七章-典型物联网通信系统
  2. HDU 6411 带劲的and和【枚举贡献】
  3. TSINGSEE青犀视频平台人脸识别比对控制比对时间间隔的代码设计
  4. android之媒体硬解OMX的实现
  5. no such instruction问题
  6. 【Algorithm】GPLT L3-014 球队“食物链”
  7. 阿里云轻量级云服务器部署Java项目
  8. ROS激光雷达导航调试记录
  9. ur5+moveit 3D perception功能应用
  10. 武清鸿蒙幼儿园,天津十大贵族学校,土豪才上的起的学校!