pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5 canvas畫帶箭頭的虛線

 本案例注意事項(xiàng):

1、當(dāng)你拖動(dòng)箭頭時(shí) canvas里面線條繪制自動(dòng)重新計(jì)算點(diǎn)。

2、canvas沒有畫虛線的api,因?yàn)閷?duì)api不是很熟悉,所以就不獻(xiàn)丑了,在網(wǎng)上找的。

3、箭頭出來后 點(diǎn)擊畫布里面的任意點(diǎn) 箭頭將延伸到該處,至于具體的應(yīng)用 修改canvas的lineTo屬性就能實(shí)現(xiàn)了。

4、具體的代碼解釋我寫的比較清楚,修改箭頭樣式只需寫過lineTo即可,非常簡單。

效果如下:

HTML5 canvas畫帶箭頭的虛線 三聯(lián)

代碼如下:

<!--程序說明:
作者:xue51
描述:該程序主要是通過exchange的支持在IE下面實(shí)現(xiàn)canvas畫帶箭頭的虛線功能,常用于圖形化工作流的設(shè)計(jì)當(dāng)中。
     雖然在IE下面可以用vml實(shí)現(xiàn),但是這個(gè)就是用來取代vml的!!!!!HTML5都來了趕緊消滅老IE
注意事項(xiàng): 1, 該程序是在老外的canvas畫虛線的基礎(chǔ)上做了改進(jìn);
         2, exchange需要2個(gè)額外的JS文件指出。
         3,使用的時(shí)候在畫布上隨意點(diǎn)點(diǎn)就就能改變箭頭的方向,至于更使用的功能需要您來親自寫寫。
-->
<!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>
<!--這個(gè)地方需要注意,在IE下面經(jīng)過轉(zhuǎn)換如果不在這里設(shè)置canvas的高和寬就會(huì)造成畫布很小-->
<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>
    
 <!--這個(gè)是老外寫的用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用于頁面沒有點(diǎn)擊的時(shí)候初始化。
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個(gè)是用來獲取頁面的自動(dòng)設(shè)置配置。
var width = document.getElementById('width');
var linecap = document.getElementById('linecap');
var dashes = document.getElementById('dashes');
//這個(gè)是核心用來畫每個(gè)線段。
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)'
//開始畫虛線。
//當(dāng) x > 起始點(diǎn)的x坐標(biāo)(即點(diǎn)擊點(diǎn) 在起始點(diǎn)的右邊)的時(shí)候 不需要 改變這4個(gè)坐標(biāo),但是當(dāng)x < 起始點(diǎn)的X坐標(biāo)(點(diǎn)擊點(diǎn)在起始點(diǎn)左邊的時(shí)候)需要改變這4個(gè)坐標(biāo)的位置
if(x > defaultX) {
ctx.dashedLine(defaultX, defaultY, x, y, dashGapArray );
}
else {
ctx.dashedLine(x, y, defaultX, defaultY, dashGapArray );
}
//虛線畫完了開始畫箭頭的4個(gè)線段
//計(jì)算4個(gè)點(diǎn)的坐標(biāo)
arr = jisuan(x, y);
//設(shè)定開始點(diǎn)。
ctx.moveTo(arr[0],arr[1]);
ctx.lineTo(x,y)
ctx.lineTo(arr[2],arr[3]);
//下面這個(gè)計(jì)算是用來在箭頭與虛線的交叉點(diǎn)。直角三角形計(jì)算原理。。
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;
}
//該函數(shù)用來根據(jù)鼠標(biāo)點(diǎn)擊點(diǎn) 計(jì)算箭頭4個(gè)點(diǎn)的坐標(biāo),在JS中cos和SIN都是計(jì)算的弧度,所以需要轉(zhuǎn)換。至于計(jì)算方法屬于屬性范疇這里不累述。
//對(duì)于該函數(shù),如果需要修改箭頭的大小 只需修改 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
//程序到這里就是一個(gè)標(biāo)準(zhǔn)獲取頁面上鼠標(biāo)的坐標(biāo)函數(shù),下面的代碼是因?yàn)?畫布的點(diǎn)不是以瀏覽器的左上角為起始點(diǎn)所以需要減去多余的距離方法如下:
var pos = c.getBoundingClientRect();
mousePos.x = mousePos.x - pos.left;
mousePos.y = mousePos.y - pos.top;
return mousePos;
}
</script>
</body>
</html>

【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了有關(guān)HTML5頁面在iPhoneX適配問題,需要的朋友可以參考下
本篇文章主要介紹了html5中canvas圖表實(shí)現(xiàn)柱狀圖的示例,本文使用canvas來實(shí)現(xiàn)一個(gè)圖表,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
Adobe公司出品的多媒體處理軟件產(chǎn)品線較多,涵蓋了音視頻編輯、圖像處理、平面設(shè)計(jì)、影視后期等領(lǐng)域。這篇文章主要介紹了Adobe Html5 Extension開發(fā)初體驗(yàn)圖文教程,非常不錯(cuò),需要的朋
這篇文章主要介紹了基于HTML5的WebGL經(jīng)典3D虛擬機(jī)房漫游動(dòng)畫,需要的朋友可以參考下
這篇文章主要介紹了手機(jī)端用rem+scss做適配的詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
本篇文章主要介紹了canvas 實(shí)現(xiàn) github404動(dòng)態(tài)效果的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 贵州水玻璃_-贵阳花溪闽兴水玻璃厂 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 数控走心机-走心机价格-双主轴走心机-宝宇百科 | 连栋温室大棚建造厂家-智能玻璃温室-薄膜温室_青州市亿诚农业科技 | 亿诺千企网-企业核心产品贸易| 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 杰恒蠕动泵-蠕动泵专业厂家-19年专注蠕动泵 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 螺杆泵_中成泵业| 太平洋亲子网_健康育儿 品质生活| 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 防火阀、排烟防火阀、电动防火阀产品生产销售商-德州凯亿空调设备有限公司 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 预制直埋蒸汽保温管-直埋管道-聚氨酯发泡保温管厂家 - 唐山市吉祥保温工贸有限公司 | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 深圳法律咨询【24小时在线】深圳律师咨询免费| sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | LCD3D打印机|教育|桌面|光固化|FDM3D打印机|3D打印设备-广州造维科技有限公司 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 飞飞影视_热门电影在线观看_影视大全 | 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 飞飞影视_热门电影在线观看_影视大全 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 冷水机-工业冷水机-冷水机组-欧科隆品牌保障 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 |