H5 canvas

canvas和svg

canvas: javaScript动态生成。“位图”,适用于像素处理和动态渲染。修改需要重绘

svg:xml静态生成。“矢量图”,不需要重绘

canvas基本结构

html

<canvas id="canvas" width="200" height="300" style="border: 1px solid blue"></canvas>

js

window.onload=function () {
    //获取canvas对象
    var cnv=document.getElementById("canvas");
    //获取上下文环境对象
    var cxt=cnv.getContext("2d");
    //绘制
    cxt.moveTo(50,50);
    cxt.lineTo(150,100);
    cxt.stroke();
}

注意1: canvas为inline-block元素,有3个参数:id,width,height。默认300*500
注意2: 在css中定义width,height无效,一定要在html中定义
注意3: canvas对象方法:
(1)getContext("2d")获取上下文环境
(2)toDataURL() 获取canvas对象产生的位图字符串
注意4: IE7 , IE8 兼容用excanvas.js
github下载地址

<!--[if IE]>
    <script src="excanvas.js"></script>
<![end if]-->

接下来,我们就来看实际的绘图操作吧!!!


1. 直线图形

一条直线

cxt.moveTo(50,50);//起始点
cxt.lineTo(150,100);//终止点
cxt.stroke();//绘制

这里写图片描述
三角形或多边形

cxt.moveTo(50,50);
cxt.lineTo(150,100);//继续lineTo(),就以前一个点为基准
cxt.lineTo(70,150);
cxt.lineTo(50,50);
cxt.stroke();

三角形
矩形

    //描边颜色。起始点,终止点,宽,高
    cxt.strokeStyle="pink";
    cxt.strokeRect(50,50,70,70);
    //填充颜色
    cxt.fillStyle="orange";
    cxt.fillRect(90,90,70,70);
    //清空
    cxt.clearRect(100,100,30,30);

这里写图片描述

常用技巧:清空整个矩形

window.onload=function () {
    //设置简写函数
    function $$(id) {
         return document.getElementById(id);
    }
    var cnv=$$("canvas");
    var cxt=cnv.getContext("2d");
    cxt.fillStyle="orange";
    cxt.fillRect(90,90,70,70);
    //清除
    var btn=$$("btn");
    btn.onclick=function () {
        cxt.clearRect(0,0,cnv.width,cnv.height);
    }
}

这里写图片描述

正多边形

内角:degree=2π/n
i < n
半径:size
原点座标:(dx,dy)

function $$(id){
	return document.getElementById(id);
}
window.onload=function(){
	var cnv=$$("canvas");
    var cxt=cnv.getContext("2d");
    //调用自定义的正多边形画法
     createPolygon(cxt,3,100,100,50);
     cxt.fillStyle="pink";
     cxt.fill();
}
//定义画正多边的函数,四个参数:图的内容,边数n,原点座标x、y,半径size
function createPolygon(cxt,n,dx,dy,size){
    cxt.beginPath();
    //计算内角
    var degree=2*Math.PI/n;
    for(var i=0;i<n;i++){
        //三个点的角度位置
        var x=Math.cos(i*degree);
        var y=Math.sin(i*degree);
        //将三个点根据座标连接起来
        cxt.lineTo(x*size+dx,y*size+dy);
    }   
    cxt.closePath();
}

曲线图形

描边圆

        function $$(id) {
            return document.getElementById(id);
        }
        window.onload=function () {
            var can=$$("can");
            var cxt=can.getContext("2d");
            //描边圆
            //开始路径
            cxt.beginPath();
            //圆心座标x、y,半径,起始度数,结束度数,逆时针
            cxt.arc(75,75,50,0,360*Math.PI/180,true);
            //结束路径
            cxt.closePath();
            //开始描边
            cxt.strokeStyle="pink";
            cxt.stroke();
        }

填充圆

 cxt.fillStyle="pink";
 cxt.fill();

半圆

 cxt.arc(75,75,50,0,180*Math.PI/180,true);

残缺圆

cxt.arc(75,75,50,0,-270*Math.PI/180,true);

弧线
去掉cxt.closePath();

圆角矩形

        function $$(id) {
            return document.getElementById(id);
        }
        window.onload=function () {
            var cnv=$$("canvas");
            var cxt=cnv.getContext("2d");
            createRoundedRect(cxt,200,100,20,20,20);
            cxt.fillStyle="blue";
            cxt.fill();
        }
        /*width,height:宽高
        r:圆角半径
        offsetX,offsetY:左上角顶点座标,第四个圆角的控制点
         */
        function createRoundedRect(cxt,width,height,r,offsetX,offsetY) {
            cxt.beginPath();
            cxt.moveTo(offsetX+r,offsetY);
            //第一个圆角
            cxt.lineTo(offsetX+width-r,offsetY);
            cxt.arcTo(offsetX+width,offsetY,offsetX+width,offsetY+r,r);
            //第二个圆角
            cxt.lineTo(offsetX+width,offsetY+height-r);
            cxt.arcTo(offsetX+width,offsetY+height,offsetX+width-r,offsetY+height,r);
            //第三个圆角
            cxt.lineTo(offsetX+r,offsetY+height);
            cxt.arcTo(offsetX,offsetY+height,offsetX,offsetY+height-r,r);
            //第四个圆角
            cxt.lineTo(offsetX,offsetY+r);
            cxt.arcTo(offsetX,offsetY,offsetX+r,offsetY,r);
            cxt.closePath();
        }

扇形

        function $$(id) {
            return document.getElementById(id);
        }
        window.onload=function () {
            var cnv=$$("canvas");
            var cxt=cnv.getContext("2d");
            createSector(cxt,cnv.width/3,cnv.height/2,90,270,200);
            cxt.fillStyle="blue";
            cxt.fill();
        }
            /**
             * 中心座标(x,y)
             * 半径r
             * 开始角度angle1
             * 结束角度angle2
             */

       function createSector(cxt,x,y,r,angle1,angle2) {
           cxt.beginPath();
           cxt.moveTo(x,y);
           cxt.arc(x,y,r,angle1*Math.PI/180,angle2*Math.PI/180,false);
           cxt.closePath();

       }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章