html5(二)canvas绘图渐变

时间:2022-01-16 05:29:40

什么是 Canvas?

HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。

画布是一个矩形区域,您可以控制其每一像素。

canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法

<canvas id="myCanvas" width="200" height="100"></canvas>
canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:

<script type="text/javascript">
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="#FF0000";
cxt.fillRect(0,0,150,75);
</script>
getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

=========================

<canvas id="draw" width="300" height="300">在这里的代码是看不见的,不支持canvas的浏览器中可以看到这里的代码,这是作兼容的方法</canvas>----------canvas设置宽高必须在元素内部。

canvas 默认大小是300*150,如果是在style中设置宽高,会相对于默认大小的倍数进行放大;



var oc=document.getElementById('draw');
var ctx=oc.getContext('2d');//获取绘制的上下问,2d表示2d图形,webgl表示3D;
ctx.fillStyle='red';//设置填充颜色

ctx.strokeStyle='red';//空心边框的颜色
ctx.arc(100,100,100,0,360*Math.PI/180);//绘制弧形或圆形
//ctx.fill();//填充渲染,
ctx.stroke(); // 空心渲染
ctx.closePath(); // 闭合路径
ctx.fillStyle='green';
ctx.beginPath(); //开始路径
ctx.arc(100,100,100,-90*Math.PI/180,-30*Math.PI/180);
ctx.fill();

=================绘制矩形==========边框问题

ctx.fillRect(0,0,100,100);--------填充

ctx.strokeRect(100,100,100,100);--------边框默认颜色是黑色,线宽1px;当边框的像素是奇数时,会出现像素被分配的现象,边缘颜色变浅,一般解决方法:吧像素设置成偶数,或者改成小数,ctx.strokeRect(100.5,100.5,100,100);

ctx.lineWidth=10;----------设置线宽

=============绘图路径======

ctx.beginPath();//开始路径
ctx.moveTo(10,10);//第一次设置的起点
ctx.lineTo(500,500);//下一个点
ctx.lineTo(300,100);
ctx.stroke();
ctx.closePath();-----------有两个作用:一是关闭刚才开始的路径,二是闭合路径。

beginPath(),closePath()不对属性线宽,颜色等起作用;

ctx.save();-----------保存上次的属性状态;

ctx.restore();------------取出上次的属性状态;

ctx.clearRect(0,0,100,100);----------清除指定矩形区域的大小;
ctx.clearRect(0,0,oc.width,oc.height);---------------清除整个画布的大小;

=========简易画笔=======待完善-========

var oc=document.getElementById('draw');
var ctx=oc.getContext('2d');


oc.onmousedown=function (ev){
ctx.fillStyle='red';
var x=ev.pageX - oc.offsetLeft;//ev.pageX是鼠标到body页面的距离,oc.offsetLeft是画布距离body的距离;
var y=ev.pageY - oc.offsetTop;
ctx.moveTo(x,y);
oc.onmousemove=function(ev){
var x=ev.pageX-oc.offsetLeft;
var y=ev.pageY-oc.offsetTop;
ctx.lineTo(x,y);
ctx.stroke();
};
oc.onmouseup=function(){
oc.onmousemove=null;
oc.onmouseup=null;
}
return false

};


===========连接处样式和线头样式=======

ctx.lineWidth=20;
ctx.lineJoin='bevel';//连接处样式,bevel是斜切,round是圆角
ctx.lineCap='round';//设置线头样式的时候不能用closePath(),round圆角,square方块
ctx.strokeRect(10,10,200,200);


============绘制曲线和圆形========

ctx.arc(100,100,100,-90*Math.PI/180,-30*Math.PI/180,false);//如绘制的不是360度,绘制出来的是扇形的一部分,如果用的是fill()会自动吧起点和终点连接,false代表是顺时针,true代表是逆时针;如果想要绘制出来的是标准的扇形,要加上起始点moveTo( 圆心);
ctx.fill();

曲线的绘制==========

ctx.moveTo(100,100);
ctx.arcTo(10,20,150,100,50);//参数两个点加一个半径
ctx.quadraticCurveTo(100,100,200,100);//前一个是控制点坐标,后一个是结束点的坐标
ctx.bezierCurveTo(10,20,30,40,50,60);//三个点一次是第一个控制点,第二个控制点,终点

=================变换=================

ctx.translate(100,100);//位移,往上和往左偏移是负数;
ctx.rotate(45*Math.PI/180);//旋转45度,默认以图形自身左上角为定点
ctx.scale(0.5,0.5)//缩放
ctx.fillRect(10,10,100,200);

============设置图片和背景===================

var img=new Image();
img.src='';
img.onload=function(){//img加载完成的时候执行绘图
ctx.drawImage(img,50,60);//3个参数,50是距离cavas左边的距离,60是距离canvas上面的距离
ctx.drawImage(img,50,60,10,20);//5个参数,50,60 同上,10和20 是图片绘制到canvas中显示的大小
ctx.drawImage(img,,,,,50,60,10,20);//9个参数,逗号的四个参数是图片本身的坐标和宽高,后面四个参数同上面的最后四个参数

var bg=ctx.createPattern(img,'repeat');//repeat--平铺,no-repeat不平铺,repeat-x是x轴平铺
ctx.fillStyle=bg;//用背景填充
ctx.fillRect(100,100,300,300);

==========canvas中的渐变===============

线性渐变--------

var lg=ctx.createLinearGradient(100,200,300,400);//线性渐变,100和200是起点坐标,300和400是终点坐标
lg.addColorStop(0,'blue');//0和0.5和1是代表颜色的位置
lg.addColorStop(0.5,'green');
lg.addColorStop(1,'yellow');
ctx.fillStyle=lg;
ctx.fillRect(10,10,100,100);


放射性渐变-----------

var rg=ctx.createRadialGradient(100,200,50,300,400 ,100);//放射性渐变100和200是第一个圆形,50是半径,300和400是第二个圆形,100是半径;
lg.addColorStop(0,'blue');//0和0.5和1是代表颜色的位置
lg.addColorStop(0.5,'green');
lg.addColorStop(1,'yellow');
ctx.fillStyle=lg;
ctx.fillRect(10,10,100,100);


阴影-------------

ctx.shadowOffsetX=10;//x轴方向偏移
ctx.shadowOffsetY=10;//y轴方向偏移
ctx.shadowColor='red';//阴影颜色
ctx.shadowBlur=5;//模糊值
ctx.fillRect(0,0,10,100);

=============