HTML5 canvas画带箭头的虚线

 本案例注意事项:

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

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

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

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

效果如下:

代码如下:

<!--程序说明:
作者:xue51
描述:该程序主要是通过exchange的支持在IE下面实现canvas画带箭头的虚线功能,常用于图形化工作流的设计当中。
     虽然在IE下面可以用vml实现,但是这个就是用来取代vml的!!!!!HTML5都来了赶紧消灭老IE
注意事项: 1, 该程序是在老外的canvas画虚线的基础上做了改进;
         2, exchange需要2个额外的JS文件指出。
         3,使用的时候在画布上随意点点就就能改变箭头的方向,至于更使用的功能需要您来亲自写写。
-->
<!DOCTYPE HTML>
<html lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>HTML Canvas Dotted Lines</title>
<style type="text/css" media="screen">
body { background:#ddd; text-align:center; }
canvas { margin:2em auto; display:block; border:1px solid #666; }
label { padding-right:2em }
</style>
<script type="text/javascript" src="excanvas.js" ></script>
<script type="text/javascript" src="jCanvaScript.1.5.15.min.js" ></script>
</head>
<body>
<!--这个地方需要注意,在IE下面经过转换如果不在这里设置canvas的高和宽就会造成画布很小-->
<canvas width="800" height="600"></canvas>
    <p>
        <label>Line Width: <input id="width" value="2" size="1"></label>
        <label>Dashes/Gaps: <input id="dashes" value="10 20" size="15"></label>
        <label>Line Cap: <select id="linecap"><option>butt</option><option selected>round</option><option>square</option></select></label>
    </p>
    
 <!--这个是老外写的用canvas画虚线的方法,直接使用-->
<script type="text/javascript" charset="utf-8">
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);
}
}
</script>
<script type="text/javascript" charset="utf-8">
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;
}
</script>
</body>
</html>

时间: 2024-08-02 22:21:29

HTML5 canvas画带箭头的虚线的相关文章

HTML5 Canvas画图板的例子

功能很简单,原理其实和拖放是类似的,主要是三个事件: 在canvas 上绑定mousedown 事件以标志绘画的开始(调用moveTo 移动画笔) 在document 上绑定mousemove 事件来处理绘画时的行为(调用lineTo 以及stroke 进行绘画) 在document 上绑定mouseup 事件以标志绘画的结束(解绑document 上的两个事件) 实现时需特别注意的一点是调用moveTo 以及lineTo 方法时如何传递正确的坐标值,这个坐标值应该是光标相对于canvas 左上

用html5的canvas画时钟的问题

问题描述 用html5的canvas画时钟的问题 问题1: //初始化画布 context.save(); context.clearRect(00canvas.widthcanvas.height); context.translate(canvas.width/2canvas.height/2); context.scale(0.90.9); context.rotate(-Math.PI/2); context.save(); 初始化的时候加一句 context.rotate(-Math.

javascript基于HTML5 canvas制作画箭头组件_javascript技巧

样例: 废话少说,直接上代码: arrow.js /** * 实现两点间画箭头的功能 * @author mapleque@163.com * @version 1.0 * @date 2013.05.23 */ ;(function(window,document){ if (window.mapleque==undefined) window.mapleque={}; if (window.mapleque.arrow!=undefined) return; /** * 组件对外接口 */

HTML5中使用Canvas绘制带阴影效果的图形

1,阴影的相关属性 HTML5 Canvas中提供了设置阴影的四个属性值分别为: context.shadowColor = "red" 表示设置阴影颜色为红色 context.shadowOffsetX = 0表示阴影相对TEXT的水平距离,0表示两者水平位置重合 context.shadowOffsetY = 0表示阴影相对TEXT的垂直距离,0表示两者垂直位置重合 context.shadowBlur = 10 阴影模糊效果,值越大模糊越厉害. shadowColor:阴影颜色(

html5 canvas做的图表插件

用highchart的时候发现它是用svg来画图的,那么用canvas来做怎么样的. 以前做AS图表插件的时候,绘制图画主要用容器的Graphics对象来绘制,而canvas的context和Graphics一样,都可以用来绘制图形. 然后就试着用canvas做了这样一个东西. 具体实现如下,个人表达能力有问题,各位看官还是看源码吧,如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-T

求一段Js上显示线段或者带箭头线段的编码!

问题描述 求一段Js上显示线段或者带箭头线段的编码! 要做的功能是点击后判断一个条件,条件不符则在页面显示一个箭头,现在不知道这个箭头怎么做.. 初接触JS,望大神赐教! <!DOCTYPE html> <html> <head> <script type="text/javascript"> function isWeiXin(){ if(){ downloadLocal(); } else{ //显示箭头 } } </scrip

Android自定义ViewGroup实现带箭头的圆角矩形菜单_Android

本文和大家一起做一个带箭头的圆角矩形菜单,大概长下面这个样子:  要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置. 最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太low了点,而且不同分辨率也不太好适配,干脆自定义一个ViewGroup吧! 自定义ViewGroup其实很简单,基本都是按一定的套路来的.  一.定义一个attrs.xml就是声明一下你的这个自定义View有哪些可配置的属性,将来使用的时候可以自由配置.这里声明了7个属性,分别是:箭头

javascript HTML5 Canvas实现圆盘抽奖功能_javascript技巧

我们经常参加各种电商优惠活动,比如购买达到一定数额进行抽奖活动,在比如微信抽奖,淘宝抽奖,迅雷赚钱宝圆盘抽奖活动等.这些抽奖活动部分就是由HTML5的Canvas来制作的,今天就为大家分享一下如何使用HTML5的Canvas来制作圆盘抽奖功能.老规矩,先看下效果图吧: 再来看看Canvas的几个主要api:   全部源代码如下: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&

Android自定义ViewGroup实现带箭头的圆角矩形菜单

本文和大家一起做一个带箭头的圆角矩形菜单,大概长下面这个样子: 要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置. 最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太low了点,而且不同分辨率也不太好适配,干脆自定义一个ViewGroup吧! 自定义ViewGroup其实很简单,基本都是按一定的套路来的. 一.定义一个attrs.xml 就是声明一下你的这个自定义View有哪些可配置的属性,将来使用的时候可以自由配置.这里声明了7个属性,分别是:箭头宽