canvas雷达扫描特效


  canvas雷达扫描特效_第1张图片

  刚开始是用canvas自带的阴影效果来实现那种光晕,不过很不理想。看到网上牛人们的特效能实现这种类似的效果,好奇之下看了下源码才找到正确思路。

  fillStyle = "rgba(0,0,0,0.03)";fillRect(0,0,400,300);这是重点。

  代码不长,火狐和chrome上可以,IE不行(刚试)。暑假在公司实习抽空写的。

<!DOCTYPE html>
<html>
<head>
	<title>test</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="Author" content="阮家友">
    <meta name="Keywords" content="HTML,model,test">
    <meta name="Description" content="special effect">
    <style type="text/css">
        html,body{font-size:14px;margin:0px;padding:0px;}
        li {list-style:none;}
        img {border:0px;}
        a {text-decoration:none;}
        .clear {clear:both;}
        
        #center {width:800px;margin:0 auto;padding-top:50px;position:relative;}
        #c1 {background-color:#333;}
    </style>
</head>
<body>
    <div id="center">
        <canvas id="c1" width="600" height="400px"></canvas><br/>
        <button id="btn1">start</button>
        <button id="btn2">stop</button>
        <button id="btn3">clear</button>
    </div>
	
<script type="text/javascript">
    //按钮事件
    var ostart = document.getElementById('btn1');
    var ostop = document.getElementById('btn2');
    var oclear = document.getElementById('btn3');
    ostart.onclick = function(){
        obj1.start();
    }
    ostop.onclick = function(){
        obj1.stop();
    }
    oclear.onclick = function(){
        obj1.clear();
    }
	
function CreateCanvasObject(canvasId,func){
    //返回的对象 包含节点Node 绘图环境GC 等属性 和 clear 等方法
    var obj = new Object();
    var ocanvas = document.getElementById(canvasId);
    var ocolor='';
    if(ocanvas.currentStyle)
		ocolor = ocanvas.currentStyle['backgroundColor'];
	else
        ocolor = getComputedStyle(ocanvas,false)['backgroundColor'];
    
    //这里要做判断 是否获取到canvas标签 否则返回 null
    
    //获取画布绘图环境
    var ocanvasGC = ocanvas.getContext('2d');
    obj = 
    {
        Node:ocanvas,
        GC:ocanvasGC,
        timer:'',
        bContinue:false,
        fun:func,
        color:ocolor,
        clear:function(){this.GC.clearRect(0,0,this.Node.width,this.Node.height);},
        start:function(){
            var oThis = this;
            if(oThis.timer)
            {
                oThis.stop();
            }
            oThis.bContinue = true;
            var loop = function()
            {
                oThis.fun(oThis);
                if(oThis.bContinue)
                {
                    oThis.timer = setTimeout(loop,10);
                }
            }
            loop();
        },
        stop:function(){clearTimeout(this.timer);this.bContinue = false;}
    }
    return obj;
}
//二维向量 可表示位置position(x,y)  速度 v(Vx,Vy) 加速度a(Gx,Gy)
Vector2 = function(x, y) { this.x = x; this.y = y; };
var degree=0;

Vector2.prototype = {
    copy : function() { return new Vector2(this.x, this.y); },
    length : function() { return Math.sqrt(this.x * this.x + this.y * this.y); },
    sqrLength : function() { return this.x * this.x + this.y * this.y; },
    normalize : function() { var inv = 1/this.length(); return new Vector2(this.x * inv, this.y * inv); },
    negate : function() { return new Vector2(-this.x, -this.y); },
    add : function(v) { return new Vector2(this.x + v.x, this.y + v.y); },
    subtract : function(v) { return new Vector2(this.x - v.x, this.y - v.y); },
    multiply : function(f) { return new Vector2(this.x * f, this.y * f); },
    divide : function(f) { var invf = 1/f; return new Vector2(this.x * invf, this.y * invf); },
    dot : function(v) { return this.x * v.x + this.y * v.y; }
};
function draw(obj){
    //obj.clear();
    //采用叠加递减效果
    obj.GC.fillStyle = "rgba(0,0,0,0.03)";
    obj.GC.fillRect(0,0,obj.Node.width,obj.Node.height);
    obj.GC.strokeStyle='#72d6fc';
    
    var halfW = obj.Node.width/2;
    var halfH = obj.Node.height/2;
    
    //扩散波动圆
    obj.GC.lineWidth=1;
    for(var k=0;k<5;k++){
        obj.GC.beginPath();
        obj.GC.arc(halfW,halfH,r1+k,0,Math.PI*2,'#72d6fc',true);
        obj.GC.closePath();
        obj.GC.stroke();
        
        obj.GC.beginPath();
        if(!bFirst)
            obj.GC.arc(halfW,halfH,r2+k,0,Math.PI*2,'#72d6fc',true);
        obj.GC.closePath();
        obj.GC.stroke();
    }
    if(r1 > R){
        r1=0;
    }
    if(r2 > R){
        r2 = 0;
        if(bFirst==true){
            bFirst=false;
        }
    }
    r1++,r2++;
    
    //旋转扫描线
    obj.GC.lineWidth=6;
    obj.GC.save();
    obj.GC.translate(obj.Node.width/2,obj.Node.height/2);
    obj.GC.rotate(degree*Math.PI/180);
    obj.GC.beginPath();
    obj.GC.moveTo(0,-3);
    obj.GC.lineTo(0,R);
    obj.GC.closePath();
    obj.GC.stroke();
    obj.GC.restore();
    
    //开始画网格
    for(var i=0;i<obj.Node.width;i+=10){
        line(obj.GC,'#7266fc',0.5,i+0.5,0,i+0.5,obj.Node.height);
    }
    for(var j=0;j<obj.Node.height;j+=10){
        line(obj.GC,'#7266fc',0.5,0,j+0.5,obj.Node.width,j+0.5);
    }
    //中心小圆点
    obj.GC.fillStyle = '#c00';
    obj.GC.beginPath();
    obj.GC.arc(halfW,halfH,4,0,Math.PI*2,true);
    obj.GC.closePath();
    obj.GC.fill();
    
    obj.GC.fillStyle = '#c00';
    obj.GC.beginPath();
    obj.GC.arc(halfW/2,halfH/2,4,0,Math.PI*2,true);
    obj.GC.closePath();
    obj.GC.fill();
    
    degree++;
}
//画线方法封装
function line(gc,color,width,startX,startY,endX,endY){
    gc.strokeStyle = color;
    gc.lineWidth=width;
    gc.beginPath();
    gc.moveTo(startX,startY);
    gc.lineTo(endX,endY);
    gc.closePath();
    gc.stroke();
}
var obj1 = CreateCanvasObject('c1',draw);
var R = Math.sqrt(Math.pow(obj1.Node.width/2,2)+Math.pow(obj1.Node.height/2,2));
var r1=0,r2=R/2,bFirst=true;
//页面打开自动运行
obj1.start();
//obj1.stop();
</script>
</body>
</html>


你可能感兴趣的:(canvas,雷达扫描特效,canvas特效)