自己封装的HTML5工具类

//画箭头
var proc={  
        /** 
         * 接收canvas对象,并在此上画箭头(箭头起止点已经设置) 
         * @param context 
         * @param flag  是否是双箭头
         */  
        paint:function(context,flag){paint(this,context,flag);},  
        /** 
         * 设置箭头起止点 
         * @param sp起点 
         * @param ep终点 
         * @param st强度 
         */  
        set:function(sp,ep,st){init(this,sp,ep,st);},  
        /** 
         * 设置箭头外观 
         * @param args 
         */  
        setPara:function(args){  
            this.size=args.arrow_size;//箭头大小  
            this.sharp=args.arrow_sharp;//箭头锐钝  
        }  
    };  
      
    var init=function(a,sp,ep,st){  
        a.sp=sp;//起点  
        a.ep=ep;//终点  
        a.st=st;//强度  
    };  
    var paint=function(a,context,flag){  
        var sp=a.sp;  
        var ep=a.ep;  
        if (context==undefined)  
            return;  
        //画箭头主线  
        context.beginPath();  
        context.moveTo(sp.x,sp.y);  
        context.lineTo(ep.x,ep.y);  
        //画箭头头部  
        var h=_calcH(a,sp,ep,context);  
        context.moveTo(ep.x,ep.y);  
        context.lineTo(h.h1.x,h.h1.y);  
        context.moveTo(ep.x,ep.y);  
        context.lineTo(h.h2.x,h.h2.y);  
        context.stroke();  
        if(flag){ //双箭头
        	//另一侧的箭头wlt添加
        	var h=_calcH(a,ep,sp,context);  
        	context.moveTo(sp.x,sp.y);  
        	context.lineTo(h.h1.x,h.h1.y);  
        	context.moveTo(sp.x,ep.y);  
        	context.lineTo(h.h2.x,h.h2.y);  
        	context.stroke();  
        }
        
    };  
    //计算头部坐标  
    var _calcH=function(a,sp,ep,context){  
        var theta=Math.atan((ep.x-sp.x)/(ep.y-sp.y));  
        var cep=_scrollXOY(ep,-theta);  
        var csp=_scrollXOY(sp,-theta);  
        var ch1={x:0,y:0};  
        var ch2={x:0,y:0};  
        var l=cep.y-csp.y;  
        ch1.x=cep.x+l*(a.sharp||0.025);  
        ch1.y=cep.y-l*(a.size||0.05);  
        ch2.x=cep.x-l*(a.sharp||0.025);  
        ch2.y=cep.y-l*(a.size||0.05);  
        var h1=_scrollXOY(ch1,theta);  
        var h2=_scrollXOY(ch2,theta);  
        return {  
            h1:h1,  
            h2:h2  
                };  
    };  
    //旋转坐标  
    var _scrollXOY=function(p,theta){  
        return {  
            x:p.x*Math.cos(theta)+p.y*Math.sin(theta),  
            y:p.y*Math.cos(theta)-p.x*Math.sin(theta)  
        };  
    };  

var Html5Util = function(a){
	
}
/**
* @param x 圆心x
* @param y 圆心y
* @param r
* @param color 半径
* @param ctx 画笔
*/
Html5Util.prototype.round = function(x,y,r,color,ctx){
	ctx.beginPath();
	//圆形3
    //arc(圆心x,圆心y,半径,开始的角度,结束的角度,是否逆时针)
	ctx.arc(x,y,r,0,Math.PI*2);
	ctx.fillStyle=color;//填充的样式
	ctx.strokeStyle=color;//边框的样式
	ctx.closePath();
	ctx.fill();//填充
	ctx.stroke();
	
}
/**
 * 画虚线
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 * @param color
 * @param ctx
 */
Html5Util.prototype.dashedLine  = function(x1, y1, x2, y2,color,ctx){
	var step = 5;
	ctx.strokeStyle = color;//线条样子
	ctx.beginPath();
	ctx.moveTo(x1, y1);

	if(x1==x2){//y轴的虚线 
		while(y1<y2){
			y1=(y1+step<=y2?y1+step:y2);
			ctx.lineTo(x1,y1); 
			y1=(y1+step<=y2?y1+step:y2);
			ctx.moveTo(x1, y1);
		}
	}else{//x轴的虚线
		while(x1<x2){
			x1=(x1+step<=x2?x1+step:x2);
			ctx.moveTo(x1, y1);
			x1=(x1+step<=x2?x1+step:x2);
			ctx.lineTo(x1,y1); 
		}
		
	}
	ctx.closePath();
	ctx.fill();
	ctx.stroke();//描边
	
	
}
/**
 * 画虚线
 * @param x1
 * @param y1
 * @param x2
 * @param y2
 * @param color
 * @param ctx
 */
Html5Util.prototype.dashedLine2  = function(sp,ep,color,ctx){
	var x1 =sp.x;
	var y1 =sp.y;
	var x2 =ep.x;
	var y2 =ep.y;
	var step = 5;
	ctx.strokeStyle = color;//线条样子
	ctx.beginPath();
	ctx.moveTo(x1, y1);
	
	if(x1==x2){//y轴的虚线 
		while(y1<y2){
			y1=(y1+step<=y2?y1+step:y2);
			ctx.lineTo(x1,y1); 
			y1=(y1+step<=y2?y1+step:y2);
			ctx.moveTo(x1, y1);
		}
	}else{//x轴的虚线
		while(x1<x2){
			x1=(x1+step<=x2?x1+step:x2);
			ctx.moveTo(x1, y1);
			x1=(x1+step<=x2?x1+step:x2);
			ctx.lineTo(x1,y1); 
		}
		
	}
	ctx.closePath();
	ctx.fill();
	ctx.stroke();//描边
	
	
}
/**
 * 
 * @param x1 矩形左上角x坐标
 * @param y1 矩形左上角y坐标
 * @param x2 矩形右下角x坐标
 * @param y2 矩形右下角y坐标
 * @param color
 * @param ctx
 */
Html5Util.prototype.dashedLineRectangle  = function(x1, y1, x2, y2,color,ctx){
	var obj = this;
	obj.dashedLine(x1, y1, x2, y1,color,ctx);//矩形上边
	obj.dashedLine(x1, y2, x2, y2,color,ctx);//矩形下边
	obj.dashedLine(x1, y1, x1, y2,color,ctx);//矩形左边
	obj.dashedLine(x2, y1, x2, y2,color,ctx);//矩形右边
}
Html5Util.prototype.text  = function(){
	guideText.texts = ["第一行文字","第二行文字","第三行文字"];
	var padding = 60; // 行距
	var adjustY = 150; // 文字欄位初始 Y
	for(var i=0;i<guideText.texts.length;i++)
	{
	    context2D.font = "bold 24pt 微軟正黑體";
	    context2D.textAlign = "center";
	    context2D.fillText(guideText.texts[i],CANVAS_WIDTH / 2, adjustY + padding*i);
	}
}
/**
 * 
 * @param e
 * @param canvas
 * @returns {x,y轴坐标}
 */
Html5Util.prototype.transEventMousePos = function(e,canvas) {
	var x = e.clientX?e.clientX:e.x;
	var y = e.clientY?e.clientY:e.y;
	
	var box = canvas.getBoundingClientRect();
	
	return {
		x:(x-box.left)*canvas.width/box.width,
		y:(y-box.top)*canvas.height/box.height
	};
};
Html5Util.prototype.isInRound = function(pos,round,r) {
	if(Math.abs(round.x-pos.x)<=r && Math.abs(round.y-pos.y)<=r) {
		return true;
	}
		return false;
}

 工具类的使用

<%@page contentType="text/html;charset=utf-8" %>
<%@page import="java.util.Map" %>
<%@page import="java.util.Iterator" %>
<% 
	String path= request.getContextPath();
	String layout_id = request.getParameter("id");
	if(layout_id == null) {
		layout_id = "";
	}
	String mode=request.getParameter("mode");
	if(mode == null) {
		mode = "";
	}
	
	Map paramMap = request.getParameterMap();
	
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>html5</title> 
<link rel="stylesheet" type="text/css" href="<%=path%>/jquery/css/jquery-ui-1.10.3.custom.css" />
<link rel="stylesheet" type="text/css" href="<%=path%>/css/layout.css" />	

<script type="text/javascript" src="<%=path%>/jquery/jquery-1.9.1.js"></script>
<script type="text/javascript" src="<%=path%>/jquery/jquery-ui-1.10.3.custom.min.js"></script>
<script type="text/javascript" src="<%=path%>/javaScript/html5.js"></script>
<style type="text/css">
	div{
		
		/* 
		width: 1080px;
		height: 380px; 
		*/
		width: 1055px;
		height: 308px; 
		border-color: #E60749;
		border: 1px; 
		border-style:solid; 
	}
</style>
<script type="text/javascript">
	$(document).ready(function(){
		test();
	});

	function test(){
		var html5Obj = new Html5Util(1);
		var r = 12;
		var div = $('#div1');
		var width = div.width();
		var height = div.height();
	
		
		var canvas=$('#Canvas1').get(0);//画布
		canvas.width= width
		canvas.height = height;
		var ctx = canvas.getContext('2d'); // 画笔
		
		var simpleColor = "#00B050"; //普通圆形的颜色 绿色
		var greyColor = "#D9D9D9"; //灰色
		var redColor = "#FF0000"; //红色
		var blueColor = "#497DBB"; //蓝色  虚线时用
		var blackColor = "#313131"; //黑色  虚线时用
		//var procColor = "#000000"; //黑色  箭头时用
		// 画圆 6个 竖向的圆
		var roundx = width*0.15;
		var roundy= height*0.1
		var step = Math.ceil(height/7); 
		html5Obj.round(roundx,step,r,simpleColor,ctx); //实体厅
		html5Obj.round(roundx,step*2,r,simpleColor,ctx);//网厅'
		html5Obj.round(roundx,step*3,r,simpleColor,ctx);//短厅
		html5Obj.round(roundx,step*4,r,simpleColor,ctx);//WAP
		html5Obj.round(roundx,step*5,r,simpleColor,ctx);//IVR
		html5Obj.round(roundx,step*6,r,simpleColor,ctx);//'其他'

		//写字
		//圆形旁边的文字
		var fontx = width*0.03;
		var fontStep = step+1;
		ctx.fillStyle="#000000";
		ctx.fillText('实体厅',fontx,step);//填充文字
		ctx.fillText('网厅',fontx,step*2);//填充文字
		ctx.fillText('短厅',fontx,step*3);
		ctx.fillText('WAP',fontx,step*4);
		ctx.fillText('IVR',fontx,step*5);
		ctx.fillText('其他',fontx,step*6);
		
		//渠道接口日志
		ctx.fillText('渠道接口日志',10,15);//填充文字
		
		//圆形旁边的竖线
		ctx.beginPath();
		ctx.moveTo(roundx+r,step);
		ctx.lineTo(roundx+r,step*6);
		ctx.lineWidth=3;
		ctx.strokeStyle = "#4D4D4D";//线条样子
		ctx.closePath();
		ctx.stroke();//描边


		

		//横向大箭头
		//ctx.moveTo(roundx+r,step*4);
		ctx.beginPath();
		ctx.strokeStyle="black";//填充的样式
		ctx.lineWidth=3;
		var y_pro_max = width-2*r;
		proc.set({x:roundx+r,y:step*4-r},{x:y_pro_max,y:step*4-r});
		proc.setPara({  
		    arrow_size:0.020,  
		    arrow_sharp:0.010  
		})  
		proc.paint(ctx);   
		ctx.closePath();

		
		//横向的圆 
		var step2 = Math.ceil((width-roundx-r)/8); 
		var firstX=roundx+step2;
		var firstY=step*4-r;
		html5Obj.round(firstX,firstY,r,simpleColor,ctx);//缴费记录
		html5Obj.round(firstX+step2,firstY,r,redColor,ctx);
		html5Obj.round(firstX+2*step2,firstY,r,simpleColor,ctx);
		html5Obj.round(firstX+3*step2,firstY,r,simpleColor,ctx);
		html5Obj.round(firstX+4*step2,firstY,r,simpleColor,ctx);
		html5Obj.round(firstX+5*step2,firstY,r,simpleColor,ctx);
		html5Obj.round(firstX+6*step2,firstY,r,greyColor,ctx);
		//圆下的文字
		var y_text_des =firstY+2*r;
		ctx.fillStyle="#000000";
		ctx.textAlign="center";  
		ctx.textBaseline="top";  //垂直的基线
		ctx.fillText('缴费记录表',firstX,y_text_des);//填充文字
		ctx.fillText('账本流水变更表',firstX+step2,y_text_des);//填充文字
		ctx.fillText('信控工单表',firstX+2*step2,y_text_des);//填充文字
		ctx.fillText('CRM账务开通表',firstX+3*step2,y_text_des);//填充文字
		ctx.fillText('服务开通订单表',firstX+4*step2,y_text_des);//填充文字
		ctx.fillText('服务开通工单表',firstX+5*step2,y_text_des);//填充文字
		ctx.fillText('指令执行工单表',firstX+6*step2,y_text_des);//填充文字
		
		
		//三个圆的
		var y_cationRound = step+r;
		html5Obj.round(firstX+step2,y_cationRound,r,redColor,ctx);
		html5Obj.round(firstX+3*step2,y_cationRound,r,simpleColor,ctx);
		html5Obj.round(firstX+5*step2,y_cationRound,r,greyColor,ctx);

		//三个圆的图例旁边的说明文字
		var y_text =y_cationRound;
		ctx.fillStyle="#000000";
		ctx.textAlign="left";  
		ctx.textBaseline="middle"; 
		ctx.fillText('超阀值',firstX+step2+r+3,y_text);//填充文字
		ctx.fillText('正常',firstX+3*step2+r+3,y_text);//填充文字
		ctx.fillText('无此环接',firstX+5*step2+r+3,y_text);//填充文字

		
		
		//画虚线
		//第一个虚线框 
		//x:网厅圆心+(step2/2)  y:网厅圆心
		ctx.lineWidth=2;
		var x1_dashedLine1 = roundx+(step2/2);
		var y1_dashedLine1 = 2*step;
		var x2_dashedLine1 = firstX+2*step2 +(step2/2)-5;
		var y2_dashedLine1 = 5*step+2*r;
     	html5Obj.dashedLineRectangle(x1_dashedLine1,y1_dashedLine1,x2_dashedLine1,y2_dashedLine1,simpleColor,ctx);//横线
     	//第二个虚线框  蓝色
		var x1_dashedLine2 = firstX+2*step2 +(step2/2)+5;
		var y1_dashedLine2 = y1_dashedLine1;
		var x2_dashedLine2 = firstX+3*step2 +(step2/2)-5;
		var y2_dashedLine2 = y2_dashedLine1;
     	html5Obj.dashedLineRectangle(x1_dashedLine2,y1_dashedLine2,x2_dashedLine2,y2_dashedLine2,blueColor,ctx);//横线
     	//第三个虚线框  红色
		var x1_dashedLine3 = firstX+3*step2 +(step2/2)+5;
		var y1_dashedLine3 = y1_dashedLine1;
		var x2_dashedLine3 = width-r;
		var y2_dashedLine3 = y2_dashedLine1;
     	html5Obj.dashedLineRectangle(x1_dashedLine3,y1_dashedLine3,x2_dashedLine3,y2_dashedLine3,redColor,ctx);//横线


     	//三个虚线框的说明文字
		var x1_text_dashedLine =x1_dashedLine1+(x2_dashedLine1-x1_dashedLine1)/2;//一个汉字大概默认为12px,减去3个汉字
		var y1_text_dashedLine =5*step;
		var x2_text_dashedLine =x1_dashedLine2+(x2_dashedLine2-x1_dashedLine2)/2;//一个汉字大概默认为12px,减去3个汉字
		var x3_text_dashedLine =x1_dashedLine3+(x2_dashedLine3-x1_dashedLine3)/2;//一个汉字大概默认为12px,减去3个汉字
		ctx.fillStyle="#000000";
		ctx.textAlign="center";    
		ctx.fillText('财务处理环节',x1_text_dashedLine,y1_text_dashedLine);//填充文字
		ctx.fillText('营业处理环节',x2_text_dashedLine,y1_text_dashedLine);//填充文字
	 	ctx.fillText('开机处理环接',x3_text_dashedLine,y1_text_dashedLine);//填充文字
		
		//一段段的双向箭头
		//第一个双向箭头
		ctx.strokeStyle="#4D4D4D";//填充的样式
		ctx.lineWidth=2;
		var x1_proc1 = roundx+r;
		var y1_proc1 = step*3-r-2;
		var x2_proc = firstX+step2
		proc.set({x:roundx+r,y:y1_proc1},{x:firstX,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 

		//第二个双向箭头
		proc.set({x:firstX,y:y1_proc1},{x:firstX+step2,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 
		//第三个双向箭头
		proc.set({x:firstX+step2,y:y1_proc1},{x:firstX+2*step2,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 
		//第四个双向箭头
		proc.set({x:firstX+2*step2,y:y1_proc1},{x:firstX+3*step2,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 
		//第五个箭头
		proc.set({x:firstX+3*step2,y:y1_proc1},{x:firstX+4*step2,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 
		//第六个双向箭头
		proc.set({x:firstX+4*step2,y:y1_proc1},{x:firstX+5*step2,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 
		//第7个箭头
		proc.set({x:firstX+5*step2,y:y1_proc1},{x:firstX+6*step2,y:y1_proc1});
		proc.setPara({arrow_size:0.08, arrow_sharp:0.05 })  
		proc.paint(ctx,true); 


		//箭头下面的虚线
		var y_d = firstY-r;
		html5Obj.dashedLine2({x:firstX,y:y1_proc1},{x:firstX,y:y_d},blackColor,ctx);
		html5Obj.dashedLine2({x:firstX+step2,y:y1_proc1},{x:firstX+step2,y:y_d},blackColor,ctx);
		html5Obj.dashedLine2({x:firstX+2*step2,y:y1_proc1},{x:firstX+2*step2,y:y_d},blackColor,ctx);
		html5Obj.dashedLine2({x:firstX+3*step2,y:y1_proc1},{x:firstX+3*step2,y:y_d},blackColor,ctx);
		html5Obj.dashedLine2({x:firstX+4*step2,y:y1_proc1},{x:firstX+4*step2,y:y_d},blackColor,ctx);
		html5Obj.dashedLine2({x:firstX+5*step2,y:y1_proc1},{x:firstX+5*step2,y:y_d},blackColor,ctx);
		html5Obj.dashedLine2({x:firstX+6*step2,y:y1_proc1},{x:firstX+6*step2,y:y_d},blackColor,ctx);
     	
     	//html5Obj.dashedLineRectangle(500,300,700,500,"#E60749",ctx);
     //	html5Obj.dashedLine(125,129,125,192,"#2A00FF",ctx);
	}
	
</script>

</head>

<body>
<div id="div1">
	<canvas id="Canvas1"></canvas>
</div>
<input type="button" value="html5" onclick=""/>
			<marquee direction=left></marquee>	
</body>
</html>

 

你可能感兴趣的:(html5)