先来看一段正常的canvas画图语法:
复制代码代码如下:
ctx.arc(centerX,centerY,radius,0,PI*2,true);
ctx.shadowColor = 'rgba(0,0,0,0.5)';
ctx.shadowBlur = "10";
ctx.fill();
ctx.beginPath();
ctx.shadowColor = 'rgba(0,0,0,0)';
ctx.moveTo(centerX-radius,centerY);
ctx.lineTo(centerX-radius,centerY - 50);
ctx.lineTo(centerX+radius,centerY - 50);
ctx.lineTo(centerX+radius,centerY);
// ctx.lineTo(centerX-radius,centerY);
ctx.fill();
ctx.beginPath();
ctx.fillStyle = 'rgba(255,0,0,1)';
ctx.arc(centerX,centerY-50,radius,0,PI*2,true);
ctx.fill();
我对canvas原生语法不爽的有两点:1是每句前面都有写ctx(即canvas的context2d对象),2是每个函数或属性都要占一行,浪费空间。
我对jQuery的链式语法很欣赏,比如:
复制代码代码如下:
$('#div1').show(300).html(p).delay(3000).slideUp(300).remove();
所以,我也想用这种语法来进行canvas绘图:
复制代码代码如下:
ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();
有个办法就是模拟一个context2d对象,这个对象支持所有的原生context2d方法,但又支持链式。
不过,代码不能太多,多了就没人喜欢用了。
下面就是完整的代码段,这个“类”我取名为XtendCanvas(又是以X开头的哟):
复制代码代码如下:
// 让canvas支持链式语法,来自十年灯
~function () {var pro = ['save','restore', 'scale', 'rotate', 'translate', 'transform', 'createLinearGradient', 'createRadialGradient', 'getLineDash', 'clearRect', 'fillRect', 'beginPath', 'closePath', 'moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'arcTo', 'rect', 'arc', 'fill', 'stroke', 'clip', 'isPointInPath', 'measureText', 'clearShadow', 'fillText', 'strokeText', 'strokeRect', 'drawImage', 'drawImageFromRect', 'putImageData', 'createPattern', 'createImageData', 'getImageData', 'lineWidth','strokeStyle','globalAlpha','fillStyle','font','shadowOffsetX','shadowOffsetY','shadowBlur','shadowColor','lineCap','lineJoin','miterLimit'];
function XtendCanvas (canvas) {
var ctx = canvas.getContext('2d'),
fn = function(){},
fnP = fn.prototype;
for(var j = 0,p=pro[0];p;p=pro[j++]) {
fn.prototype[p] = function (p) {
return function () {
var args = Array.prototype.slice.call(arguments);
// console.log(args);
if(typeof ctx[p] == 'function') {
ctx[p].apply(ctx,args);
} else {
ctx[p] = args+'';
}
return fnP;
};
}(p);
}
return new fn;
};
window.XtendCanvas = XtendCanvas;
}();
使用方法很简单,给他传一个canvas对象,他就会返回一个类似context2d的对象,你可以像普通的context2d一样使用,但不同的是,他支持链式语法了:
复制代码代码如下:
var cvs = document.getElementById('cvs');
var ctx = XtendCanvas(cvs);
ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();
这样一来你就可以把所有操作都放在一句话里,你也可以随时中断,做其他的事,然后继续。
这段代码并不是对canvas的增强,只是单纯的让他支持链式语法了。但胜在代码少,可以嵌入到任何JS库中,在此我希望能得到你的一个“推荐”
代码中肯定有值得改进的地方,大家可以自行完善。但——吃水不忘挖井人,希望大家记得我,最重要的是思路,对吧?下面就是思路:
大家可以看到,代码中最长的部分,是那个保存方法名的数组pro,核心代码反而很短。为什么我要建这么一个数组呢?
本来我也想直接从CanvasRenderingContext2D继承所有原生方法,但每个浏览器下面遍历这个CanvasRenderingContext2D,结果都不一致。如果我把他们直接继承,那么当你想用chrome中的方法套在firefox里执行,就会报错。
所以我只是把CanvasRenderingContext2D中的通用的,无异议的方法与属性名提取了出来,没办法,只有建一个固定的数组——大家可以自行决定往里面添加你的方法。
方法与属性提取出来了,接着就是把原生的方法加在我的新对象上。我建了一个叫fn的空函数,放置我的方法。
由于数组中的这些元素既有函数,也有属性,所以我在循环中判断了他是否是一个函数,如果是函数,就带参数执行;不是函数——那么就肯定是属性了,就把参数赋给这个属性。
这样大家在碰到设置canvas属性的时候,就不用中断链了,直接把属性值当参数传进去就行了,比如:
复制代码代码如下:
ctx.strokeStyle('#f00')
最后,关键的关键,就是返回fn,这招是从jQuery学来的,是支持链式语法的关键。
这段中用到了匿名函数,闭包,原型,以及我以前文章讲过的奇怪的for循环。
说起来好像挺简单的,不过我实在是想了很久,希望对大家有用。
在写代码的过程中,我发现chrome的做法很不错,他有一串以set开头的函数,如setStrokeColor,setLineCap等函数,给他们传参数,就可以替代对应的strokeStyle和lineCap等属性,也就是说,他的canvas里面就全是函数而没有属性了那样的话我就不用判断是函数还是是属性了。但firefox里面没有这些,所以我还是只能用前面的思路。
我也把那一串set函数给放出来吧:
复制代码代码如下:
var bak = ['setTransform','setAlpha', 'setCompositeOperation', 'setLineWidth', 'setLineCap', 'setLineJoin', 'setMiterLimit', 'setLineDash','setShadow','setStrokeColor','setFillColor'];
他们的用处一看就懂。你也可以选择一些加入前面代码的pro数组中。
最后,我很奇怪我的代码怎么会没有高亮了。。。如果你都看到最后了,那么还是给个推荐吧,让我也虚荣一把
复制代码代码如下:
ctx.arc(centerX,centerY,radius,0,PI*2,true);
ctx.shadowColor = 'rgba(0,0,0,0.5)';
ctx.shadowBlur = "10";
ctx.fill();
ctx.beginPath();
ctx.shadowColor = 'rgba(0,0,0,0)';
ctx.moveTo(centerX-radius,centerY);
ctx.lineTo(centerX-radius,centerY - 50);
ctx.lineTo(centerX+radius,centerY - 50);
ctx.lineTo(centerX+radius,centerY);
// ctx.lineTo(centerX-radius,centerY);
ctx.fill();
ctx.beginPath();
ctx.fillStyle = 'rgba(255,0,0,1)';
ctx.arc(centerX,centerY-50,radius,0,PI*2,true);
ctx.fill();
我对canvas原生语法不爽的有两点:1是每句前面都有写ctx(即canvas的context2d对象),2是每个函数或属性都要占一行,浪费空间。
我对jQuery的链式语法很欣赏,比如:
复制代码代码如下:
$('#div1').show(300).html(p).delay(3000).slideUp(300).remove();
所以,我也想用这种语法来进行canvas绘图:
复制代码代码如下:
ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();
有个办法就是模拟一个context2d对象,这个对象支持所有的原生context2d方法,但又支持链式。
不过,代码不能太多,多了就没人喜欢用了。
下面就是完整的代码段,这个“类”我取名为XtendCanvas(又是以X开头的哟):
复制代码代码如下:
// 让canvas支持链式语法,来自十年灯
~function () {var pro = ['save','restore', 'scale', 'rotate', 'translate', 'transform', 'createLinearGradient', 'createRadialGradient', 'getLineDash', 'clearRect', 'fillRect', 'beginPath', 'closePath', 'moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'arcTo', 'rect', 'arc', 'fill', 'stroke', 'clip', 'isPointInPath', 'measureText', 'clearShadow', 'fillText', 'strokeText', 'strokeRect', 'drawImage', 'drawImageFromRect', 'putImageData', 'createPattern', 'createImageData', 'getImageData', 'lineWidth','strokeStyle','globalAlpha','fillStyle','font','shadowOffsetX','shadowOffsetY','shadowBlur','shadowColor','lineCap','lineJoin','miterLimit'];
function XtendCanvas (canvas) {
var ctx = canvas.getContext('2d'),
fn = function(){},
fnP = fn.prototype;
for(var j = 0,p=pro[0];p;p=pro[j++]) {
fn.prototype[p] = function (p) {
return function () {
var args = Array.prototype.slice.call(arguments);
// console.log(args);
if(typeof ctx[p] == 'function') {
ctx[p].apply(ctx,args);
} else {
ctx[p] = args+'';
}
return fnP;
};
}(p);
}
return new fn;
};
window.XtendCanvas = XtendCanvas;
}();
使用方法很简单,给他传一个canvas对象,他就会返回一个类似context2d的对象,你可以像普通的context2d一样使用,但不同的是,他支持链式语法了:
复制代码代码如下:
var cvs = document.getElementById('cvs');
var ctx = XtendCanvas(cvs);
ctx.moveTo(500,0).lineTo(500,500).strokeStyle('#f00').stroke();
这样一来你就可以把所有操作都放在一句话里,你也可以随时中断,做其他的事,然后继续。
这段代码并不是对canvas的增强,只是单纯的让他支持链式语法了。但胜在代码少,可以嵌入到任何JS库中,在此我希望能得到你的一个“推荐”
代码中肯定有值得改进的地方,大家可以自行完善。但——吃水不忘挖井人,希望大家记得我,最重要的是思路,对吧?下面就是思路:
大家可以看到,代码中最长的部分,是那个保存方法名的数组pro,核心代码反而很短。为什么我要建这么一个数组呢?
本来我也想直接从CanvasRenderingContext2D继承所有原生方法,但每个浏览器下面遍历这个CanvasRenderingContext2D,结果都不一致。如果我把他们直接继承,那么当你想用chrome中的方法套在firefox里执行,就会报错。
所以我只是把CanvasRenderingContext2D中的通用的,无异议的方法与属性名提取了出来,没办法,只有建一个固定的数组——大家可以自行决定往里面添加你的方法。
方法与属性提取出来了,接着就是把原生的方法加在我的新对象上。我建了一个叫fn的空函数,放置我的方法。
由于数组中的这些元素既有函数,也有属性,所以我在循环中判断了他是否是一个函数,如果是函数,就带参数执行;不是函数——那么就肯定是属性了,就把参数赋给这个属性。
这样大家在碰到设置canvas属性的时候,就不用中断链了,直接把属性值当参数传进去就行了,比如:
复制代码代码如下:
ctx.strokeStyle('#f00')
最后,关键的关键,就是返回fn,这招是从jQuery学来的,是支持链式语法的关键。
这段中用到了匿名函数,闭包,原型,以及我以前文章讲过的奇怪的for循环。
说起来好像挺简单的,不过我实在是想了很久,希望对大家有用。
在写代码的过程中,我发现chrome的做法很不错,他有一串以set开头的函数,如setStrokeColor,setLineCap等函数,给他们传参数,就可以替代对应的strokeStyle和lineCap等属性,也就是说,他的canvas里面就全是函数而没有属性了那样的话我就不用判断是函数还是是属性了。但firefox里面没有这些,所以我还是只能用前面的思路。
我也把那一串set函数给放出来吧:
复制代码代码如下:
var bak = ['setTransform','setAlpha', 'setCompositeOperation', 'setLineWidth', 'setLineCap', 'setLineJoin', 'setMiterLimit', 'setLineDash','setShadow','setStrokeColor','setFillColor'];
他们的用处一看就懂。你也可以选择一些加入前面代码的pro数组中。
最后,我很奇怪我的代码怎么会没有高亮了。。。如果你都看到最后了,那么还是给个推荐吧,让我也虚荣一把
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】