canvas-1

canvas是一个状态的操作变化

<canvas id="canvas"></canvas>
<script>
var canva = documentgetElementById("canvas");//获取到页面中的画布
var context = canva.getContext("2d");//获取到画布中的画笔(状态)
context.beginPanth();//开始本次画图
context.moveTo(0,0);//本次画笔初始位置
context.linTo(200,200);//画笔到达位置
context.strokeStyle="red";//本次画笔颜色状态
context.stroke();//绘制本次画笔状态并结束
</script>

beginPanth()以防万一这个是必要的
closePanth()画封闭图形时使用,放在stroke里面
fillStyle对封闭图形的填充与fill()(颜色填充绘制函数)成对出现

画五角星
  • 画五角星就要算出来五角星每个点的坐标位置,最好的办法就是利用两个圆来算出每个点的坐标如下:


function drawStrat(obj,R,r,x,y,rot){
    var cet = obj.getContext('2d');
    cet.beginPath();
    for(var i=0;i<5;i++){
    //在js里面角度要转换成弧度来计算,把五角星的十个点分成两个圆来算坐标位置,在canvas里面y轴是从上往下的与数学方向相反
    cet.lineTo(Math.cos((18+i*72-rot)/180*Math.PI)*R+x,
            -Math.sin((18+i*72-rot)/180*Math.PI)*R+y);
    cet.lineTo(Math.cos((54+i*72-rot)/180*Math.PI)*r+x,
            -Math.sin((54+i*72-rot)/180*Math.PI)*r+y);
    }
    cet.closePath();
    cet.strokeStyle = 'yellow';
    cet.stroke();
}

其中,obj是canvas,R表示大圆的半径,r表示小圆的半径,x、y表示五角星的坐标,rot表示五角星旋转角度。

  • 下面是满天星的代码:
var canva_4 = document.getElementById('test_4');
for(var i=0;i<100;i++){
    var r = Math.random()*10+10;
    var x = Math.random()*canva_4.width;
    var y = Math.random()*canva_4.height;
    var rot = Math.random()*360;
    drawStrat(canva_4,r,r/2,x,y,rot);
}
图形变换

translate(x,y) 移动的位移坐标
ratate(deg) 旋转角度
scale(sx,sy) 缩放 <使用这个缩放的话,不仅图形大小会缩放,图形的坐标也会跟着缩放,图形的边框也会跟着缩放,所以视情况使用>
save() 保存当前环境的状态。与 restore() 返回之前保存过的路径状态和属性。成对出现

var canva_1 = document.getElementById('test_1');
var cext = canva_1.getContext('2d');
cext.beginPath();
cext.save();
cext.translate(200,200);
cext.rotate(45);
cext.scale(2,2);
cext.fillStyle='pink';
cext.fillRect(0,0,100,100);
cext.restore();
cext.closePath();
                
cext.beginPath();
cext.save();
cext.translate(300,300);
cext.fillStyle='green';
cext.fillRect(0,0,100,100);
cext.restore();
cext.closePath();
  • 图形变换实质是对一个图形的所有顶点坐标进行一次再计算,这个计算的过程是由一个叫做变换矩阵来完成的,二维的变换矩阵是3*3,三维的就是4*4等。

    transform(a,b,c,d,e,f) 设置变换矩阵,替换绘图的当前转换矩阵。
    setTransform(a,b,c,d,e,f) 将当前转换重置为单位矩阵。然后运行 transform()。
var canva_1 = document.getElementById('test_1');
var cext = canva_1.getContext('2d');
cext.beginPath();
cext.fillStyle='green';
cext.strokeStyle='black';
cext.lineWidth = 5;
cext.save();
cext.transform(1,0,0,1,0,0);
cext.transform(1,0,0,1,100,50);
cext.transform(2,0,0,2,100,50);
cext.transform(1,0.2,0.2,2,100,50);
cext.setTransform(1,0,0,1,0,0);
cext.fillRect(0,0,100,100);
cext.strokeRect(0,0,100,100);
cext.restore();
cext.closePath();

每次设置的transform()都会被下面的延续,所有才有setTransform()来重置前面设置过的。

  • 深入了解 fillStyle

createLinearGradient(xstart,ystart,xend,yend) 创建线性渐变(用在画布内容上)。
createRadialGradient(x0,y0,r0,x1,y1,r1) 创建放射状/环形的渐变(用在画布内容上)。
addColorStop(stop,color) 规定渐变对象中的颜色和停止位置。

var canva_1 = document.getElementById('test_1');
var cext = canva_1.getContext('2d');
var lineGrad = createLinearGradient(0,0,400,400);
lineGrad.addColorStop(0.0,'#fff');
lineGrad.addColorStop(1.0,'#000');
cext.fillStyle = lineGrad;
cext.fillRect(0,0,400,400);

createPattern(img,'repeat-style') 在指定的方向上重复指定的元素。也就是可以让画笔填充状态为一张图片,一个画布,一段视频

//画笔填充状态为一张图片
var canva_1 = document.getElementById('test_1');
var ctx = canva_1.getContext('2d');
var canvaImg = new Image();
canvaImg.src = 'test.jpg';
canvaImg.onload = function(){
    var pattern = ctx.createPattern(canvaImg ,'repeat');
    ctx.fillStyle = pattern;
    ctx.fillRect(0,0,100,100);
}
//画笔填充状态为一个画布
var canva_2 = document.getElementById('test_2');
var cxt = canva_2.getContext('2d');
var pat = cxt.createPattern(_canva(),'repeat');
cxt.fillStyle = pat;
cxt.fillRect(0,0,500,500);
function _canva(){
    var _canva = document.createElement('canvas');
    var cxst = _canva.getContext('2d');
    _canva.height = 100;
    _canva.width = 100;
    _canva.style.border = '1px solid blue';
    cxst.beginPath();
    for(var i=0;i<5;i++){                                             
        cxst.lineTo(Math.cos((18+i*72)/180*Math.PI)*50+50,
                -Math.sin((18+i*72)/180*Math.PI)*50+50);
        cxst.lineTo(Math.cos((54+i*72)/180*Math.PI)*25+50,
                -Math.sin((54+i*72)/180*Math.PI)*25+50);
}
    cxst.closePath();
    cxst.fillStyle='yellow';
    cxst.fill();
    return _canva;
};

总结fillStyle的相关内容,所有fillStyle的函数方法都可以用在strokeStyle

fillStyle总结.png

gradient渐变.png

其他填充状态.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • canvas元素的基础知识 在页面上放置一个canvas元素,就相当于在页面上放置了一块画布,可以在其中进行图形的...
    oWSQo阅读 10,274评论 0 19
  • 1 Canvas接口元素定义 1.1 getContext()方法 为了在canvas上绘制,你必须先得到一个画布...
    Kevin_Junbaozi阅读 1,294评论 1 2
  •   HTML5 添加的最受欢迎的功能就是 元素。这个元素负责在页面中设定一个区域,然后就可以通过 JavaScri...
    霜天晓阅读 3,000评论 0 2
  • 书中代码示例效果展示:Core HTML5 Canvas Examples 基础知识 canvas元素 canva...
    szu_bee阅读 2,810评论 2 28
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,939评论 3 40