canvas的一些简单绘制方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canvas的一些简单绘制方法相关的知识,希望对你有一定的参考价值。

绘画矩形、矩形框、圆、圆环、圆圈~

<canvas class="myCanvas" width="500" height="500"></canvas><!--定义宽高只能在行内定义,否则画的图会与你想象的不一样哦,不信可以试试-->
    <script>
        var c = document.getElementsByClassName(myCanvas)[0];//获取节点
        var ctx = c.getContext(2d);//定义节点的canvas,之后就通过getContext进行canvas的绘制
        
        /*矩形*/
        ctx.fillStyle = gray;//定义填充样式
        ctx.strokeStyle = green;//定义线性样式
        ctx.lineWidth = 10;//定义线性的线宽,宽是从矩形框向内外两边同时加粗的
        ctx.fillRect(100,50,100,100);//定义面性矩形[这四个参数分别是(横坐标,纵坐标,宽,高)]{这是灰色的矩形}
        ctx.strokeRect(300,50,100,100);//定义线性矩形[这四个参数分别是(横坐标,纵坐标,宽,高)]{这是绿色的矩形框}
        ctx.rect(100,200,100,100);//定义矩形(包括面性或者线性)
        ctx.fill();ctx.stroke();//定义到底是线性还是面性,线面性上单独的在上面已经有了,线面性是定义在同个矩形就是灰色矩形加个绿色的边框

        /**/
        ctx.beginPath();//这里可以理解为另外起笔,如果忽略这个步骤那么下面的样式就会继承上面的,所以最好不要忽略
        ctx.fillStyle = blue;//定义填充样式
        ctx.lineWidth = 10;//定义线性的线宽,宽是从圆圈向内外两边同时加粗的
        ctx.arc(150,400,50,0,2*Math.PI);//定义圆[这五个参数分别是(横坐标,纵坐标,半径,起始的点(弧度),结束的点(弧度))]
        ctx.fill();//定义圆为面性即蓝色圆面

        ctx.beginPath();//另外起笔
        ctx.strokeStyle = red;//定义线性的样式
        ctx.lineWidth = 10;//定义线性的线宽,宽是从圆圈向内外两边同时加粗的
        ctx.arc(350,400,50,0,2*Math.PI);//定义圆[这五个参数分别是(横坐标,纵坐标,半径,起始的点(弧度),结束的点(弧度))]
        ctx.stroke();//定义圆为线性即红色圆圈或者圆环

        ctx.beginPath();//另外起笔
        ctx.fillStyle = blue;//定义填充样式
        ctx.strokeStyle = red;//定义线性的样式
        ctx.lineWidth = 10;//定义线性的线宽,宽是从圆圈向内外两边同时加粗的
        ctx.arc(350,250,50,0,2*Math.PI);//定义圆[这五个参数分别是(横坐标,纵坐标,半径,起始的点(弧度),结束的点(弧度))]
        ctx.stroke();ctx.fill();//同一坐标,同一半径组成了一个同心圆
    </script>

 写字并且放置字体的位置

以下代码所展现的样式是文字在顶部居中:

技术分享

<canvas id="myCanvas" width="500px" height="500px"></canvas><!--定义宽高只能在行内定义,否则画的图会与你想象的不一样哦,不信可以试试-->
<script>
        var c = document.getElementById(myCanvas);//获取节点
        var ctx = c.getContext(2d);//定义节点的canvas,之后就通过getContext进行canvas的绘制

        ctx.beginPath();
        /*水平居中*/
//        ctx.textAlign = ‘start‘;//这是以横坐标为250(因为下面横坐标为250)为基线来使参考线在文字的右边
        ctx.textAlign = center;//这是以横坐标为参考线为参考线来使参考线在文字的正中间
//        ctx.textAlign = ‘end‘;//这是以横坐标为参考线为参考线来使参考线在文字的右边
        /*垂直居中*/
//        ctx.textBaseline = ‘top‘;//这是以纵坐标为参考线使参考线在文字的上面
        ctx.textBaseline = middle;//这是以纵坐标为参考线使参考线在文字的正中间
//        ctx.textBaseline = ‘bottom‘;//这是以纵坐标为参考线使参考线在文字的下面

        ctx.fillStyle = rgb(182,194,154);//定义填充样式这三个参数为r:红,g:绿,b:蓝,即(红,绿,蓝)
        ctx.strokeStyle = rgb(220,87,18);//定义线性样式
        ctx.font = italic bolder 20px arial;//定义文本字体这四个参数分别为(斜体,加粗,字体大小(必须带单位),微软雅黑)
        ctx.fillText(Hello world!,250,20);//这是填充性文本,因为20是字体的大小,所以设置20是是标准的在顶部,三个参数分别为(内容,横坐标,纵坐标)[字体的左下角为(0,0)]
//        ctx.strokeText(‘你好世界!‘,0,250);//这是填充性文本三个参数分别为(内容,横坐标,纵坐标)[字体的左下角为(0,0)]
//
        ctx.beginPath();//提笔另起
        ctx.strokeStyle = red;//定义线性样式
        ctx.moveTo(250,0);/*定义起始位置*/ctx.lineTo(250,500);//定义结束位置--"Hello world!"的横向参考线
        ctx.moveTo(0,20);/*定义起始位置*/ctx.lineTo(500,20);//定义结束位置--"Hello world!"的纵向参考线
        ctx.stroke();//选择线性方式
</script>

 以下代码则文本在文本框的中心位置:

技术分享

<canvas id="myCanvas" width="500px" height="500px"></canvas><!--定义宽高只能在行内定义,否则画的图会与你想象的不一样哦,不信可以试试-->
    <script>
        var c = document.getElementById(myCanvas);//获取节点
        var ctx = c.getContext(2d);//定义节点的canvas,之后就通过getContext进行canvas的绘制

        ctx.beginPath();
        /*水平居中*/
//        ctx.textAlign = ‘start‘;//这是以横坐标为250(因为下面横坐标为250)为基线来使参考线在文字的右边
        ctx.textAlign = center;//这是以横坐标为参考线为参考线来使参考线在文字的正中间
//        ctx.textAlign = ‘end‘;//这是以横坐标为参考线为参考线来使参考线在文字的右边
        /*垂直居中*/
//        ctx.textBaseline = ‘top‘;//这是以纵坐标为参考线使参考线在文字的上面
        ctx.textBaseline = middle;//这是以纵坐标为参考线使参考线在文字的正中间
     ctx.fillStyle = rgb(182,194,154);//定义填充样式这三个参数为r:红,g:绿,b:蓝,即(红,绿,蓝)
        ctx.strokeStyle = rgb(220,87,18);//定义线性样式
        ctx.font = italic bolder 20px arial;//定义文本字体这四个参数分别为(斜体,加粗,字体大小(必须带单位),微软雅黑)
     ctx.beginPath();//提笔另起
        ctx.strokeStyle = red;//定义线性样式
        ctx.moveTo(250,0);/*定义起始位置*/ctx.lineTo(250,500);//定义结束位置--"Hello world!"的横向参考线
        ctx.stroke();//选择线性方式
//
        ctx.beginPath();//提笔另起
        ctx.strokeStyle = black;//定义线性样式

        ctx.textAlign = center;
        ctx.textBaseline = middle;
        ctx.moveTo(0,250);/*定义起始位置*/ctx.lineTo(500,250);//定义结束位置--"你好世界"的横向参考线
     ctx.stroke();//选择线性方式
        ctx.strokeText(你好世界!,250,250);//黑空星的你好世界在文本框的的正中新
    </script>

用线段来画一个大箭头

技术分享

<canvas id="myCanvas2" width="400px" height="400px"></canvas>
    <script>
        var myCanvas2 = document.getElementById(myCanvas2);//获取节点
        var ctx2 = myCanvas2.getContext(2d);//平面编辑
        ctx2.beginPath();//开始
        ctx2.strokeStyle = #000;//线性样式为黑色
        ctx2.lineJoin = round;//圆角    这是每个接点显得比较圆润的效果
//        ctx2.lineJoin = ‘miter‘;//默认    这是默认的效果,显得比较尖
//        ctx2.lineJoin = ‘bevel‘;//切角    这是切角的效果,显得比较钝
        ctx2.lineWidth = 10;//线宽为10px
        var x=50,y=50;//申明变量,方便下面画的图平移的效果
        ctx2.moveTo(0+x,150+y);//起点
        ctx2.lineTo(150+x,0+y);//接点
        ctx2.lineTo(300+x,150+y);//接点
        ctx2.lineTo(225+x,150+y);//接点
        ctx2.lineTo(225+x,300+y);//接点
        ctx2.lineTo(75+x,300+y);//接点
        ctx2.lineTo(75+x,150+y);//接点
        ctx2.closePath();//封闭接口
        ctx2.stroke();//线性绘画
    </script>

运用图片

<canvas width="300px" height="300px" id="myCanvas">
   <img src="sight.jpg" alt="" id="canvasImg"/><!--这里添加图片是添加不上的-->
</canvas>
<script>
   var c = document.getElementById(myCanvas);//获取canvas的节点
   var ctx = c.getContext(2d);//平面绘画
   var canvasImg = document.getElementById(canvasImg);//获取img的节点
   var img = new Image();//获取图片的方法
   img.src = sight.jpg;//图片的路径
   canvasImg.onload = function(){//页面加载完成时
     ctx.drawImage(canvasImg,0,0,300,300);//添加图片[图片,横坐标,纵坐标,宽带,高度]
   }
</script>

制作动态下雨效果

<canvas class="myCanvas" height="500px" width="500px"style="background: #ECF3F8;display: block;margin: auto;"></canvas>
    <script>
        window.onload = function(){//页面加载完成时执行
            var c = document.getElementsByClassName(myCanvas)[0];//获取节点
            var ctx = c.getContext(2d);//平面绘画
            ctx.fillStyle = (rgba(36,196,191,0.8));//填充样式的rgba即颜色[红,绿,蓝,alpha(透明度0-1之间的数)]

            function myX() {//声明横坐标即雨点的位置函数
                window.requestAnimationFrame(myX);//使频率和电脑一样,这里也可以用setInterval
                var x = 0, y = 0,h = 0;//声明变量
                x = Math.floor(Math.random() * 500);//横坐标获取随机数数
                h = Math.floor(Math.random()*30+10);//雨点的长度获取随机数
                function myY() {//申明纵坐标即雨下的函数
                    ctx.beginPath();//开始
                    y += 8;//纵坐标自加8
                    ctx.fillRect(x, y, 2, h);//雨点的位置即长度[下雨的位置,向下落的动态,雨的宽度]
                    window.requestAnimationFrame(myY);//使频率和电脑一样防止雨滴出现闪烁的原因,这里一定不能用setInterval
                }
                myY();//调用函数,与window.requestAnimationFrame(myY);形成递归
                ctx.clearRect(0, 0, 500, 500);//清除雨滴
            }
            myX();//调用函数,与window.requestAnimationFrame(myX);形成递归
        }
    </script>

制作画板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>painting</title>
</head>
<body>
    <canvas class="myCanvas" width="500px" height="500px" style="display: block;margin: auto;background: #ECF3F8;cursor: pointer"></canvas>
    <input type="color" id="color"/>
    <input type="range" id="range" min="1" max="100" value="5"/>
    <span id="show"></span>
</body>
<script>
    window.onload = function(){
        var c = document.getElementsByClassName(myCanvas)[0];//获取节点
        var ctx = c.getContext(2d);//这里面只能是2d表示在二维的画布里写的意思

        var range = document.getElementById(range);//获取节点
        var show = document.getElementById(show);//获取节点
        function change(){//这是改变画笔粗细的函数
            show.innerText= range.value;//span标签里的值即为range标签里选择的大小
            requestAnimationFrame(change);//span标签里的数字随着range的改变而改变,这是递归
        }change();//调用

        var moveNum = false;//声明变量
        c.onmousedown = function (e) {//鼠标按下事件
            var e = e || event;//解决兼容问题
            var x = e.clientX - c.offsetLeft;//找到鼠标的横坐标
            var y = e.clientY - c.offsetTop;//鼠标的纵坐标
            ctx.beginPath();//起笔
            ctx.lineWidth = range.value;//线条的粗细
            var color = document.getElementById(color);//获取节点
            var val = color.value;//获取节点的值
            ctx.strokeStyle = val;//将颜色的值赋给线条样式

            ctx.moveTo(x,y);//画笔的起点位置
            moveNum = true;//令moveNum等于true,
        };
        c.onmousemove = function(){//鼠标移动事件
            var e = e || event;//兼容问题
            var x = e.clientX - c.offsetLeft;
            var y = e.clientY - c.offsetTop;
            if(moveNum){//如果move为true即为有值的情况下也就是说必须鼠标按下过后才能执行操作
                ctx.lineTo(x,y);//终点,也就是鼠标弹起的情况就停止了绘画
                ctx.stroke();//采用线性的方式绘画
            }
        };
        document.onmouseup = function(){//鼠标弹起事件
            return moveNum = false;//返回moveNum为false即为无值得情况,则什么也不做即结束绘画
        };
    }
</script>
</html>

制作水波效果

<canvas class="myCanvas" height="500px" width="500px"style="background: #ECF3F8;display: block;margin: auto;"></canvas>
    <script>
        window.onload = function(){//页面加载完成后执行
            var c = document.getElementsByClassName(myCanvas)[0];//获取节点
            var ctx = c.getContext(2d);//平面绘画

            c.addEventListener(click,function(e){//点击事件
                var e = e || event;//浏览器兼容问题
                var x = e.clientX - c.offsetLeft;//获取鼠标横坐标
                var y = e.clientY - c.offsetTop;//获取鼠标纵坐标

                var addR = 0;//声明变量让半径从0开始
                var alpha = 1;//申明变量设置透明度
                function recursion(){//申明函数
                    ctx.fillStyle = rgba(36,196,191,+alpha+);//填充样式
                    addR += 1;//半径每次自加1
                    alpha -=0.01;//透明度每次自减0.01
                    ctx.beginPath();//开始
                    ctx.arc(x,y,addR,0,2*Math.PI);//画圆(水波)[鼠标点击的横坐标,鼠标点击的纵坐标,圆的起始位置,圆的结束位置]
                    ctx.fill();//填充类型
                    /*if(alpha <= 0){
                     ctx.clearRect(0,0,500,500);//如果这里打开的话那么你第一个点击的水波(圆)颜色不会渐变
                     }*/
                    if(alpha >= 0){
                        window.requestAnimationFrame(recursion);//和电脑使用相同的频率,防止水波最大时闪动消失
                    }
                }
                recursion();//调用函数,与window.requestAnimationFrame(recursion);形成递归
            });
            function clear(){//声明清除水波的函数
                ctx.clearRect(0,0,500,500);//清除水波
                window.requestAnimationFrame(clear);//和电脑使用相同的频率,防止水波最大时闪动消失,这里可以解决第一个点击的水波(圆)颜色不会渐变的问题
            }
            clear();//调用函数,与window.requestAnimationFrame(clear);形成递归
        }
    </script>


以上是关于canvas的一些简单绘制方法的主要内容,如果未能解决你的问题,请参考以下文章

HTML5Canvas绘制效率如何?

使用Canvas绘制简单的时钟控件

Android自定义View(3) 《Canvas绘制简单的图形》

createjs 绘制圆形图片

canvas drawImage第一次不绘制图像

Android自定义View实战教程5??---Canvas详解及代码绘制安卓机器人