6.2.1_描边与填充绘制器

来源:互联网 发布:淘宝上刘老中医可靠吗 编辑:程序博客网 时间:2024/06/14 04:56

6.2.1_描边与填充绘制器

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title>描边与填充绘制器-使用精灵</title>        <style>            body{                background: #ddd;            }            #canvas{                background: #fff;                cursor: pointer;                margin: 10px;                -webkit-box-shadow: 3px 3px 6px rgba(0,0,0,0.5);                -moz-box-shadow: 3px 3px 6px rgba(0,0,0,0.5);                box-shadow: 3px 3px 6px rgba(0,0,0,0.5);            }        </style>    </head>    <body>        <canvas id="canvas" width="600" height="600"></canvas>    </body>    <!-- 精灵对象 -->    <script>        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 || [];        }        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);                }            }        }    </script>    <!--         享元模式:使用一个对象来表示多个概念,就是享元模式。              如本例只有一个实例的bll的精灵对象,但是确绘制了三个表针及表盘中心    -->    <script>        var canvas = document.getElementById('canvas');        var context = canvas.getContext('2d');        var clock_radius = canvas.width/2 - 15;        var hour_hand_truncation = 35;        var ballPainter = {            paint:function(sprite,context){                var x = sprite.left+sprite.width/2;                var y = sprite.top + sprite.height/2;                var width = sprite.width;                var height = sprite.height;                var 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();            }        }        var ball = new Sprite('ball',ballPainter);        //初始化        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;        drawGrid('lightgray',10,10);        window.requestAnimationFrame(animate);        function animate(){            context.clearRect(0,0,canvas.width,canvas.height);            drawGrid('lightgray',10,10);            drawClock();            window.requestAnimationFrame(animate);        }        //绘制表        function drawClock(){            drawClockFace();            drawHands();        }        //绘制表针们        function drawHands(){            var date = new Date();            var hour = date.getHours();            //秒针            ball.width = 20;            ball.height =20;            drawHand(date.getSeconds(),false);            //分针            context.save();            context.lineWidth =1;            ball.width = 30;            ball.height = 30;            drawHand(date.getMinutes(),false);            context.restore();            //时针            context.save();            context.lineWidth =2;            hour = hour>12? hour-12:hour;            ball.width = 40;            ball.height = 40;            drawHand(hour*5 + (date.getMinutes()/60)*5,true);            context.restore();            //表心            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 drawHand(time,isHour){            var angle = (Math.PI*2)*time/60 - Math.PI/2;            var handRudius = isHour? clock_radius - hour_hand_truncation:clock_radius;            lineEnd = { //线与球的交汇处                x:canvas.width/2+Math.cos(angle)*(handRudius - ball.width/2),                y:canvas.height/2+Math.sin(angle)*(handRudius - 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)*handRudius - ball.width/2;            ball.top = canvas.height/2 +Math.sin(angle)*handRudius - ball.height/2;            ball.paint(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 drawGrid(color, stepX, stepY) {            context.save();            context.shadowColor = undefined;            context.shadowOffsetX = 0;            context.shadowOffsetY = 0;            context.shadowBlur = 0;            context.strokeStyle = color;            context.lineWidth = 0.5;            context.fillStyle = '#fff';            context.fillRect(0, 0, canvas.width, canvas.height);            for(var i = stepX + 0.5; i < context.canvas.width; i += stepX) {                context.beginPath();                context.moveTo(i, 0);                context.lineTo(i, context.canvas.height);                context.stroke();            }            for(var i = stepY + 0.5; i < context.canvas.height; i += stepY) {                context.beginPath();                context.moveTo(0, i);                context.lineTo(context.canvas.width, i);                context.stroke();            }            context.restore();        }    </script></html>
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办 保险标志保险卡都没给怎么办 新买的电动自行车不符合标准怎么办 电费的户号12位怎么办? 买到过期的药品怎么办 淘宝代销宝贝信息不全怎么办 en和eng读不明显怎么办 快递收件人填错手机号没收到怎么办 快递收件人电话写错了怎么办 收件人电话写错了怎么办 大货要出货了数量错误怎么办 手被烫伤留疤怎么办 cbg被下单不能改价怎么办 浪琴手表日期中午跳怎么办 社保一体卡丢失了怎么办 京东付款七天不发货怎么办 电动车电机锁钥匙丢了怎么办 电瓶车锁钥匙丢了怎么办 苹果平板ld忘了怎么办 平板版本太低6.0怎么办 ios平板版本太低怎么办 微信公众号重名怎么办 发票规格型号填错了怎么办 鲁大师检测硬盘有问题怎么办 英文成绩单翻译错了怎么办 川航订机票名字写错了怎么办 亚航电子登机牌没有保存怎么办 cfa考试准考证名字有错怎么办 火车票护照号错了怎么办 国际机票名字错一个字怎么办 国际机票名字拼音错了怎么办 订机票名字写错了怎么办 亚航机票护照号写错怎么办 打发过了的奶油怎么办? 孩子生了没人带怎么办