• canvas 之


    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <style>
    #canvas { border:solid 1px #ccc;}
    </style>
    </head>
    <script src="sprite.js"></script>
    
    <body>
    <canvas id="canvas" width="600" height="600"></canvas>
    
    
    <script>
    
    
    
        
    
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d"),
    CLOCK_RADIUS = canvas.width/2 -15 ,
    hour_hand_truncation =35,    
    ballPainter = {   //画小球
        paint:function(sprite,context){
            var x =sprite.left +sprite.width/2,
            y = sprite.top +sprite.height/2,
            width = sprite.width,
            height = sprite.height,
            radius = sprite.width/2;
            context.save();
            context.beginPath();
            context.arc(x,y,radius,0,Math.PI*2,false);
            context.clip();
            
            context.shadowColor = "rgb(0,0,0)";
            context.shadowOffsetX = -4;
            context.shadowOffsetY = -4;
            context.shadowBlur = 8;
            
            context.fillStyle = "rgba(218,165,32,0.1)";
            context.fill();
            
            context.lineWidth =2;
            context.strokeStyle = "rgb(100,100,195)";
            context.stroke();
            context.restore();
            }
        },
    ball =  new Sprite("ball",ballPainter);
    
    // 画网格  
    function drawGrid(color,stepx,stepy){
        context.strokeStyle = color;
        context.lineWidth =0.5;
        for(var i =stepx +0.5;i<canvas.width;i+=stepx){
            context.beginPath();
            context.moveTo(i,0);
            context.lineTo(i,canvas.height);
            context.stroke();
            }
        for(var  i =stepx +0.5;i<canvas.height;i+=stepx){
            context.beginPath();
            context.moveTo(0,i);
            context.lineTo(canvas.width,i);
            context.stroke();
            }
        }
    //画指针函数 
    function drawHand(loc,isHour){
        var angle = (Math.PI *2 )*(loc/60) - Math.PI/2,
        handRadius = isHour ? CLOCK_RADIUS - hour_hand_truncation : CLOCK_RADIUS,
        
        lineEnd = {
            x:canvas.width/2 + Math.cos(angle)*(handRadius - ball.width /2),
            
            y:canvas.height/2 +Math.sin(angle)*(handRadius - ball.width /2)
            };
        context.beginPath();
        context.moveTo(canvas.width/2,canvas.height/2);
        context.lineTo(lineEnd.x , lineEnd.y);
        context.stroke();
        
        ball.left = canvas.width/2 + Math.cos(angle)*handRadius - ball.width/2;
        ball.top = canvas.height/2 + Math.sin(angle)*handRadius - ball.height/2;
        
        ball.paint(context);
    }
    
    function drawClock (){
        drawClockFace();
        drawHands();
        }
    // 画多个指针
    function drawHands(){
        var date = new Date(),
        hour = date.getHours();
        
        ball.width = 20;
        ball.height =20;
        drawHand(date.getSeconds(),false);
        
        hour = hour >12 ? hour -12 :hour ;
        ball.width = 35;
        ball.height = 35 ;
        drawHand(date.getMinutes() ,false );
        
        ball.width =50;
        ball.height =50;
        drawHand(hour*5 +(date.getMinutes()/60)*5);
        
        ball.width =10;
        ball.height =10 ;
        
        ball.left = canvas.width/2 - ball.width/2;
        ball.top =  canvas.height /2 - ball.height/2 ;
        
        ballPainter.paint(ball,context);
        }
    // 画表盘
    function drawClockFace(){
        context.beginPath();
        context.arc(canvas.width/2,canvas.height/2,CLOCK_RADIUS,0,Math.PI*2,false );
        context.save();
        context.strokeStyle = "rgba(0,0,0,0.2)";
        context.stroke();
        context.restore();
        
    }
    // 运动函数 
    function animate(){
        context.clearRect(0,0,canvas.width,canvas.height);
        drawGrid("lightgray",10,10);
        drawClock();
          
        window.requestNextAnimationFrame(animate);
        
        }
    
    context.lineWidth =0.5;
    context.strokeStyle = "rgba(0,0,0,0.2)";
    context.shadowColor = "rgba(0,0,0,0.5)";
    context.shadowOffsetX =2;
    context.shadowOffsetY = 2;
    context.shadowBlur =4;
    context.stroke();
    
    window.requestNextAnimationFrame(animate);
    
    drawGrid("lightgray",10,10);
    
    </script>
    
    </body>
    </html>

    sprite  js  

    var Sprite = function (name,painter,behaviors){
        if(name!== undefined){this.name = name }
        if(painter!== undefined){this.painter = painter}
        
        this.top =0;
        this.left =0;
        this.width =10;
        this.height = 10;
        this.velocityX = 0;
        this.velocityY =0;
        this.visible = true;
        this.animating = false ;
        this.behaviors = behaviors || [] ;
        return this ;
    }    
    Sprite.prototype = {
        paint:function (context){
            if(this.painter !== undefined && this.visible){
                this.painter.paint(this,context);
                }
            },
        update:function(context,time){
            for(var i=0;i<this.behaviors.length;++i){
                this.behaviors[i].execute(this,context,time);
                }
            }
        
        }
    window.requestNextAnimationFrame = (function(){
        var originalWebkitMethod, wrapper = undefined,callback = undefined,
        geckoVersion = 0 , userAgent = navigator.userAgent, index =0 , self =this;
        
        if(window.webkitRequestAnimationFrame){
            
            wrapper = function (time){
                
                if(time === undefined ){
                    
                    time = +new Date();
                    }
                    self.callback(time);
                };
            
            originalWebkitMethod = window.webkitRequestAnimationFrame;
            
            window.webkitRequestAnimationFrame = function (callback,element){
                self.callback = callback ;
                originalWebkitMethod(wrapper,element);
                
                }
            
            }
        if(window.mozRequestAnimationFrame){
            index = userAgent.indexOf("rv:");
            if(userAgent.indexOf("GecKo") != -1){
                geckoVersion = userAgent.substr(index +3 ,3);
                if(geckoVersion ==="2.0"){
                    window.mozRequestAnimationFrame = undefined ;
                    }
                
                }
            }
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame ||window.msRequestAnimationFrame || function (callback,element){
            var start,finish;
            window.setTimeout(function(){
                start = +new Date();
                callback(start);
                finish = +new Date();
                
                self.timeout = 1000/60 - (finish -start);
                
                
                },self.timeout);
            
            }
        
        })()
        // JavaScript Document
  • 相关阅读:
    图论————拓扑排序
    状态压缩DP:蒙德里安的梦想
    差分+贪心:IncDec序列
    三目运算符
    贪心+高精度:国王游戏
    图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较
    图论——Floyd算法拓展及其动规本质
    图论——最短路:Floyd,Dijkstra,Bellman-Ford,SPFA算法及最小环问题
    贪心+DFS:引水入城
    网站移动版本开发踩坑实录一
  • 原文地址:https://www.cnblogs.com/xiaotian747/p/3806627.html
Copyright © 2020-2023  润新知