2 quicksilvery quicksilvery 于 2016.02.16 12:49 提问

canvas在setInterval中无法画图(各参数传递正确)

不使用setInterval能正常画图,但是如果给画图部分套上setInterval(function(){画图},6000) 以后,就画不出来了。 我在画图函数的各个位置都设置了alert,各个参数都正确地传递了。但是图就是画不出来。

window.onload = function (){






    var canvas = document.createElement('canvas');
    var canvas_width = $("body").css("width").split("p")[0];
    var canvas_height = $("body").css("height").split("p")[0];


    document.body.appendChild(canvas);
    canvas.id='homePageCanvas';
    canvas.width = canvas_width; 
    canvas.height = canvas_height;
    canvas.style.display="none";

    var ctx1 = document.getElementById('homePageCanvas');
    var ctx=ctx1.getContext("2d");


    var hei=canvas.height;
    var wid=canvas_width; //传递body尺寸



    var heartSize;  //心的大小

    var color= [
    ["#FDE09A","#F3A7AC","#F29A63","#EB6161","#D8220D"],
    ["#FFE67A","#B4D78D","#00989E","#F6AC1A","#D8220D"],
    ["#D9C7C9","#B38893","#C6A7BE","#8D6982","#D8220D"],
    ["#FFE67A","#00989E","#B4D78D","#F6AC1A","#D8220D"],
    ["#E0F1F4","#9BCB60","#629A30","#49BCBD","#9F0052"],
    ["#FBCB72","#E9528E","#F39700","#E61C64","#E7242E"],
    ["#6BC8F2","#FFF8A5","#F19DB4","#5064AE","#E61C64"],
    ["#EBF5EB","#EE869A","#A2D7DD","#CBE3AE","#00AACE"],
    ["#8AC782","#9E4F1E","#EF8453","#F8C499","#007746"],
    ["#EFEB56","#008CD6","#6CBB5A","#EB6EA0","#6F186E"]];
    //颜色数组


    var posAndSize=Math.floor(Math.random()*2);//决定取哪一组“坐标数组和尺寸数组”


    //坐标数组
    var pos=[[[1,1.5],[2,2],[4,5],[1,5],[2,4],[6,3],[8,1.7],[9,5]],
    [[1,2],[3,2],[4,4],[1,4],[2,3],[6,3],[8,3],[9,4]]];


    //尺寸数组
    var size=[[0.109375,0.109375,0.109375,0.08984375,0.08984375,0.2015625,0.140234375,0.08984375],
    [0.109375,0.125,0.109375,0.08984375,0.08984375,0.2015625,0.140234375,0.08984375]];





    //决定取哪一组颜色 0到9之间的整数
    var bColor=Math.floor(Math.random()*10+0);

    //画背景
    ctx.fillStyle=color[bColor][0];
    ctx.fillRect(0,0,wid,hei);

    //以下是出问题的部分,把setinterval( function(){},6000)拿掉,则画图正常
    setInterval(function(){
        for(var i=0;i<8;i++){

            //心形的坐标
            var initX=(wid/10)*(pos[posAndSize][i][0]);
            var initY=(hei/6)*(pos[posAndSize][i][1]);


            //心形的尺寸,旋转角度,颜色
            var heartSize=size[posAndSize][i]*wid/2.2;
            var rotateAng=Math.floor(Math.random()*80+(-40))*Math.PI/180;
            var colorX=color[bColor][Math.floor(Math.random()*4)+1];
            //


            //画心形
            ctx.save();
            ctx.beginPath();
            heartCurve(initX,initY,heartSize,rotateAng,colorX);
            ctx.restore(); 

        }
    },6000);




    function heartCurve(initX,initY,heartSize,rotateAng,color){

    this.centryX=initX;
    this.centryY=initY;
    this.heartSize=heartSize;
    this.rotateAng=rotateAng;
    this.color=color;

    //alert(this.centryX);


        var x = 1, y;       
        //alert(x);
        //alert(this.heartSize);



        ctx.translate(this.centryX,this.centryY);
        ctx.rotate(rotateAng);
        ctx.fillStyle = this.color;
        ctx.beginPath();
        //alert(x);
        do { 
            y = -this.heartSize*0.8*(Math.sqrt(1-x*x) + Math.pow(x*x,1/3)); 
            x -= 0.001; 

            ctx.lineTo(this.heartSize*x,y); 
        } while ( x >= -1 ); 
        //alert(x);
        do { 
            y = this.heartSize*0.8*(Math.sqrt(1-x*x) - Math.pow(x*x,1/3)); 
            x += 0.001; 
            ctx.lineTo(this.heartSize*x,y); 
        } while ( x <= 1 );
        //alert(x);


        ctx.closePath();
        //alert(this.color);

        //alert(this.color);
        ctx.fill();
        //alert(color);

    }

//把画的图设为背景
    document.body.style.background = "url('"+homePageCanvas.toDataURL()+"')";
    document.body.style.backgroundPosition="center";
    document.body.style.backgroundRepeat="no-repeat";
    document.body.style.backgroundAttachment="fixed";


} 

1个回答

showbo
showbo   Ds   Rxr 2016.02.16 14:08
已采纳

因为你延时6s才绘制心形,你设置背景的时候心形还没有当然绘制不出来

    <script>
        window.onload = function () {

            var canvas = document.createElement('canvas');
            var canvas_width = document.body.clientWidth;// $("body").css("width").split("p")[0];
            var canvas_height = document.body.clientHeight; //$("body").css("height").split("p")[0];

            document.body.appendChild(canvas);
            canvas.id = 'homePageCanvas';
            canvas.width = canvas_width;
            canvas.height = canvas_height;
            canvas.style.display = "none";

            var ctx1 = document.getElementById('homePageCanvas');
            var ctx = ctx1.getContext("2d");


            var hei = canvas.height;
            var wid = canvas_width; //传递body尺寸



            var heartSize;  //心的大小

            var color = [
            ["#FDE09A", "#F3A7AC", "#F29A63", "#EB6161", "#D8220D"],
            ["#FFE67A", "#B4D78D", "#00989E", "#F6AC1A", "#D8220D"],
            ["#D9C7C9", "#B38893", "#C6A7BE", "#8D6982", "#D8220D"],
            ["#FFE67A", "#00989E", "#B4D78D", "#F6AC1A", "#D8220D"],
            ["#E0F1F4", "#9BCB60", "#629A30", "#49BCBD", "#9F0052"],
            ["#FBCB72", "#E9528E", "#F39700", "#E61C64", "#E7242E"],
            ["#6BC8F2", "#FFF8A5", "#F19DB4", "#5064AE", "#E61C64"],
            ["#EBF5EB", "#EE869A", "#A2D7DD", "#CBE3AE", "#00AACE"],
            ["#8AC782", "#9E4F1E", "#EF8453", "#F8C499", "#007746"],
            ["#EFEB56", "#008CD6", "#6CBB5A", "#EB6EA0", "#6F186E"]];
            //颜色数组


            var posAndSize = Math.floor(Math.random() * 2);//决定取哪一组“坐标数组和尺寸数组”


            //坐标数组
            var pos = [[[1, 1.5], [2, 2], [4, 5], [1, 5], [2, 4], [6, 3], [8, 1.7], [9, 5]],
            [[1, 2], [3, 2], [4, 4], [1, 4], [2, 3], [6, 3], [8, 3], [9, 4]]];


            //尺寸数组
            var size = [[0.109375, 0.109375, 0.109375, 0.08984375, 0.08984375, 0.2015625, 0.140234375, 0.08984375],
            [0.109375, 0.125, 0.109375, 0.08984375, 0.08984375, 0.2015625, 0.140234375, 0.08984375]];





            //决定取哪一组颜色 0到9之间的整数
            var bColor = Math.floor(Math.random() * 10 + 0);//如果背景色每次也要切换,将这句放入DrawHeart里面
            function DrawHeart() {/////////////

                ///var bColor = Math.floor(Math.random() * 10 + 0);///背景也随机变化


                ctx.clearRect(0, 0, wid, hei);//清空画布,要不会叠加

                //画背景

                //以下是出问题的部分,把setinterval( function(){},6000)拿掉,则画图正常

                ctx.fillStyle = color[bColor][0];
                ctx.fillRect(0, 0, wid, hei);
                for (var i = 0; i < 8; i++) {

                    //心形的坐标
                    var initX = (wid / 10) * (pos[posAndSize][i][0]);
                    var initY = (hei / 6) * (pos[posAndSize][i][1]);


                    //心形的尺寸,旋转角度,颜色
                    var heartSize = size[posAndSize][i] * wid / 2.2;
                    var rotateAng = Math.floor(Math.random() * 80 + (-40)) * Math.PI / 180;
                    var colorX = color[bColor][Math.floor(Math.random() * 4) + 1];
                    //


                    //画心形
                    ctx.save();
                    ctx.beginPath();
                    heartCurve(initX, initY, heartSize, rotateAng, colorX);
                    ctx.restore();

                }

                document.body.style.background = "url('" + homePageCanvas.toDataURL() + "')";//
            }




            function heartCurve(initX, initY, heartSize, rotateAng, color) {

                this.centryX = initX;
                this.centryY = initY;
                this.heartSize = heartSize;
                this.rotateAng = rotateAng;
                this.color = color;

                //alert(this.centryX);


                var x = 1, y;
                //alert(x);
                //alert(this.heartSize);



                ctx.translate(this.centryX, this.centryY);
                ctx.rotate(rotateAng);
                ctx.fillStyle = this.color;
                ctx.beginPath();
                //alert(x);
                do {
                    y = -this.heartSize * 0.8 * (Math.sqrt(1 - x * x) + Math.pow(x * x, 1 / 3));
                    x -= 0.001;

                    ctx.lineTo(this.heartSize * x, y);
                } while (x >= -1);
                //alert(x);
                do {
                    y = this.heartSize * 0.8 * (Math.sqrt(1 - x * x) - Math.pow(x * x, 1 / 3));
                    x += 0.001;
                    ctx.lineTo(this.heartSize * x, y);
                } while (x <= 1);
                //alert(x);


                ctx.closePath();
                //alert(this.color);

                //alert(this.color);
                ctx.fill();
                //alert(color);

            }

            //把画的图设为背景
            //document.body.style.background = "url('" + homePageCanvas.toDataURL() + "')";
            document.body.style.backgroundPosition = "center";
            document.body.style.backgroundRepeat = "no-repeat";
            document.body.style.backgroundAttachment = "fixed";

            DrawHeart();/////////////////////////调用绘制图形的方法,在方法里面设置背景


            setInterval(DrawHeart, 6000);////////计时器
        }
    </script>
quicksilvery
quicksilvery 多谢!!成功了!! >_< 结帐!!
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
h5 canvas画布、setInterval定时器、addEventListener事件
事件: 一个事件可以分为以下几点: 事件源、事件名、事件的注册、事件的处理。 西点发生火灾事件 事件源是西点 事件名:火灾 事件的注册:西点归大桥站消防武警管理,这个管理是在发生事件前就分配好的。所以是他们来处理。 事件处理:喷水 点击事件: 事件的名字就叫click 获取事件源,点=谁发生了什么事 Element.addEventListener(‘事件名’,functio
canvas学习之路(一)基础绘图功能解析
canvas的一些基础画图功能还是比较容易懂的,只是有些功能初次接触的话比较难以理解,需要自己仔细琢磨。我把这些功能以及自己学习过程遇到的问题写下来希望能帮到大家。(一)canvas介绍canvas是H5的的新功能,本身没有画图的功能,相当于一块画板,所有的绘图工作在画板上完成。画图的工作在js内部完成。 画板的建立 这里要注意的是canvas画板建立在body中,其宽高一定要写在元素内部。其属
canvas绘图调用方法
这次记录一下有关canvas中一些方法的调用,从在画布当中绘制出自己的图像。 首先调用绘图画布的方法getContext(context)来绘制图形。context的属性值一般为2d。 绘制图形中,有两种形式,一种是线条型,另一种是填充型。分别采用的属性为:strokeStyle(x,y,width,height)、fillStyle(x,y,width,height). 例:绘制出两个不同
如何解决Android Canvas画图,不能动态展示在界面上的问题
最近用Canvas画图,发现画图的过程不能实时显示在ImageView上,虽然尝试了以下三种方法,仍然不行按照google的一些建议添加了setWillNotDraw(false); 也不行把画图过程写在onDraw里面,每隔一段时间imageView.invalidate(), 也不行。发现onDraw没有被调用的到。后来又更改代码使得onDraw隔一段时间被调用一次,但是每次onDraw调用,...
Canvas绘制雨滴(二)之setInterval与setTimeout
用setTimeout实现setInterval,并放在Rain原型的move属性中。运行结果:画面显示混乱,浏览器卡死。。原因是: setTimeout与setInterval尽量不要写在函数里, 无论是定时器还是延时器,他们会严重阻碍程序的正常运行流程。这次程序又多次调用定时器函数,重复执行,性能降低。此外,设置定时器属于业务代码,而在原型中定义的属性属于逻辑代码。应该将两者分开写。便于debug和整理。
怎么让setInterval传递参数
//setInterval默认不能传递参数,可以封装一个函数把变量放在一个无参函数内再返回var _setInterval=setInterval; setInterval(timerr,1000,$('.last_time')); window.setInterval=function(callback,time,params){ var params=Array.slice.apply
SWT之Canvas绘图
在很多时候我们做用户界面的时候,可以直接用SWT给我们提供的组件,但是如果我们的应用SWT没有直接提供组件使用的话,可以自己动手画一个组件,然后添加相应的listener。下面是一个在Canvas上绘图的代码,网上有的博客说shell要在canvas之后,在gc之前打开,这个本人代码验证过,是不正确的。 在工程文件夹下放置一个pic_1.png图片,然后运行下面代码。看下面的代码:
C# WPF Canvas绘图
//清除canvas画布 DrawCanvas.Children.Clear(); //直线对象 Line mydrawline = new Line(); mydrawline.Stroke= Brushes.Black;//外宽颜色,在直线里为线颜色 mydrawline.StrokeThickness = 3;//线宽度 mydrawline.Height = 30; mydrawline.W
Android中Canvas绘图方法的实现
Android中2D图形可以使用Canvas来实现,我们可以通过重写View.onDraw()方法来实现Canvas对象。 常用方法 drawBitmap() 绘制位图 drawCircle() 绘制圆形 drawColor() 绘制填充画布颜色 drawLine() 绘制
canvas实现简单的画图功能
canvas实现简单的画图功能功能描述: 有红绿蓝三种颜色的画笔,可以选择画笔的粗细,画出的图可以保存到右边的六个画框中。当右边的六个画框都画满之后,便不能继续保存来了。可以清除画框,清除画布。保存的图片可以右击保存为png格式。实现效果如图所示: 实现代码:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">