首页 前端知识 HTML5 CSS3 诱人的实例 :canvas 模拟实现电子彩票刮刮乐(1)

HTML5 CSS3 诱人的实例 :canvas 模拟实现电子彩票刮刮乐(1)

2024-06-16 01:06:19 前端知识 前端哥 967 467 我要收藏

var w = end.x - start.x , h = end.y - start.y;

if (isFill)

{

context.fillRect(start.x, start.y, w, h);

}

else

{

context.strokeRect(start.x, start.y, w, h);

}

};

/**

  • 根据书写的文本,得到该文本在canvas上书写的中心位置的左上角坐标

  • @param text

  • @returns {{x: number, y: number}}

*/

this.caculateTextCenterPos = function (text)

{

var metrics = context.measureText(text);

console.log(metrics);

// context.font = fontSize + “px Verdana, Geneva, sans-serif”;

var textWidth = metrics.width;

var textHeight = parseInt(context.font);

return {

x: width / 2 - textWidth / 2,

y: height / 2 - textHeight / 2

};

}

this.width = function ()

{

return width;

}

this.height = function ()

{

return height;

}

this.resetOffset = function ()

{

pageOffset = $canvas.offset();

}

/**

  • 当屏幕大小发生变化,重新计算offset

*/

$(window).resize(function ()

{

pageOffset = $canvas.offset();

});

/**

  • 将页面上的左边转化为canvas中的坐标

  • @param pageX

  • @param pageY

  • @returns {{x: number, y: number}}

*/

this.getCanvasPoint = function (pageX, pageY)

{

return{

x: pageX - pageOffset.left,

y: pageY - pageOffset.top

}

}

/**

  • 清除区域,此用户鼠标擦出刮奖涂层

  • @param start

  • @returns {*}

*/

this.clearRect = function (start)

{

context.clearRect(start.x, start.y, 10, 10);

return this;

};

/**

*将文本绘制到canvas的中间

  • @param text

  • @param fill

*/

this.drawTextInCenter = function (text, fill)

{

var point = this.caculateTextCenterPos(text);

if (fill)

{

context.fillText(text, point.x, point.y);

}

else

{

context.strokeText(text, point.x, point.y);

}

};

/**

  • 设置画笔宽度

  • @param newWidth

  • @returns {*}

*/

this.penWidth = function (newWidth)

{

if (arguments.length)

{

context.lineWidth = newWidth;

return this;

}

return context.lineWidth;

};

/**

  • 设置画笔颜色

  • @param newColor

  • @returns {*}

*/

this.penColor = function (newColor)

{

if (arguments.length)

{

context.strokeStyle = newColor;

context.fillStyle = newColor;

return this;

}

return context.strokeStyle;

};

/**

  • 设置字体大小

  • @param fontSize

  • @returns {*}

*/

this.fontSize = function (fontSize)

{

if (arguments.length)

{

context.font = fontSize + “px Verdana, Geneva, sans-serif”;

return this;

}

return context.fontSize;

}

}

这个类也就对Canvas对象进行了简单的封装,设置参数,绘制图形什么的,比较简单,大家可以完善下这个类~

3、GuaGuaLe.js

/**

  • Created with JetBrains WebStorm.

  • User: zhy

  • Date: 14-6-24

  • Time: 上午11:36

  • To change this template use File | Settings | File Templates.

*/

function GuaGuaLe(idFront, idBack)

{

this.$eleBack = $(“#” + idBack);

this.$eleFront = $(“#” + idFront);

this.frontCanvas = new Canvas2D(this.$eleFront);

this.backCanvas = new Canvas2D(this.$eleBack);

this.isStart = false;

}

GuaGuaLe.prototype = {

constructor: GuaGuaLe,

/**

  • 将用户的传入的参数和默认参数做合并

  • @param desAttr

  • @returns {{frontFillColor: string, backFillColor: string, backFontColor: string, backFontSize: number, msg: string}}

*/

mergeAttr: function (desAttr)

{

var defaultAttr = {

frontFillColor: “silver”,

backFillColor: “gold”,

backFontColor: “red”,

backFontSize: 24,

msg: “谢谢惠顾”

};

for (var p in desAttr)

{

defaultAttr[p] = desAttr[p];

}

return defaultAttr;

},

init: function (desAttr)

{

var attr = this.mergeAttr(desAttr);

//初始化canvas

this.backCanvas.penColor(attr.backFillColor);

this.backCanvas.fontSize(attr.backFontSize);

this.backCanvas.drawRect({x: 0, y: 0}, {x: this.backCanvas.width(), y: this.backCanvas.height()}, true);

this.backCanvas.penColor(attr.backFontColor);

this.backCanvas.drawTextInCenter(attr.msg, true);

//初始化canvas

this.frontCanvas.penColor(attr.frontFillColor);

this.frontCanvas.drawRect({x: 0, y: 0}, {x: this.frontCanvas.width(), y: this.frontCanvas.height()}, true);

var _this = this;

//设置事件

this.$eleFront.mousedown(function (event)

{

_this.mouseDown(event);

}).mousemove(function (event)

{

_this.mouseMove(event);

}).mouseup(function (event)

{

_this.mouseUp(event);

});

},

mouseDown: function (event)

{

this.isStart = true;

this.startPoint = this.frontCanvas.getCanvasPoint(event.pageX, event.pageY);

},

mouseMove: function (event)

{

if (!this.isStart)return;

var p = this.frontCanvas.getCanvasPoint(event.pageX, event.pageY);

this.frontCanvas.clearRect§;

},

mouseUp: function (event)

{

this.isStart = false;

}

};

通过用户传入的两个canvas的id,然后生成一个对象,进行初始化操作,设置事件。当然了也提供用户设置可选的参数,各种颜色,已经刮开后显示的信息等,通过{

frontFillColor: “silver”,

backFillColor: “gold”,

backFontColor: “red”,

backFontSize: 24,

msg: “谢谢惠顾”

};传给init方法进行设置。

好了,然后就基本完工了,测试一下:

基本实现了刮开图层,但是存在一个小问题,就是当用户滑动特别快时,会出现一些断点,当然也可以忽略,不过我们准备提供一下解决方案:

产生原因:由于鼠标移动速度过快,产生的断点;解决方案:将mousemove中两次的鼠标左边,进行拆分成多个断点坐标:

如上图,把两点之间进行连线,根据斜率,然后分成多个小段,分别获得线段上的坐标(有四种可能,有兴趣可以画画图,计算下,代码如下):

var k;

if (p.x > this.startPoint.x)

{

k = (p.y - this.startPoint.y) / (p.x - this.startPoint.x);

for (var i = this.startPoint.x; i < p.x; i += 5)

{

this.frontCanvas.clearRect({x: i, y: (this.startPoint.y + (i - this.startPoint.x) * k)});

}

} else

{

k = (p.y - this.startPoint.y) / (p.x - this.startPoint.x);

for (var i = this.startPoint.x; i > p.x; i -= 5)

{

this.frontCanvas.clearRect({x: i, y: (this.startPoint.y + ( i - this.startPoint.x ) * k)});

}

}

this.startPoint = p;

4、最后贴一下完整的GuaGuaLe.js

/**

  • Created with JetBrains WebStorm.

  • User: zhy

  • Date: 14-6-24

  • Time: 上午11:36

  • To change this template use File | Settings | File Templates.

*/

function GuaGuaLe(idFront, idBack)

{

this.$eleBack = $(“#” + idBack);

this.$eleFront = $(“#” + idFront);

this.frontCanvas = new Canvas2D(this.$eleFront);

this.backCanvas = new Canvas2D(this.$eleBack);

this.isStart = false;

}

GuaGuaLe.prototype = {

constructor: GuaGuaLe,

/**

  • 将用户的传入的参数和默认参数做合并

  • @param desAttr

  • @returns {{frontFillColor: string, backFillColor: string, backFontColor: string, backFontSize: number, msg: string}}

*/

mergeAttr: function (desAttr)

{

var defaultAttr = {

frontFillColor: “silver”,

backFillColor: “gold”,

backFontColor: “red”,

backFontSize: 24,

msg: “谢谢惠顾”

};

for (var p in desAttr)

{

defaultAttr[p] = desAttr[p];

}

return defaultAttr;

},

init: function (desAttr)

{
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

  • 330页PDF Android学习核心笔记(内含上面8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT部分大厂面试题(有解析)

好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android高级架构师

由于篇幅问题,我呢也将自己当前所在技术领域的各项知识点、工具、框架等汇总成一份技术路线图,还有一些架构进阶视频、全套学习PDF文件、面试文档、源码笔记。

  • 330页PDF Android学习核心笔记(内含上面8大板块)

[外链图片转存中…(img-raGoAl27-1712279117866)]

[外链图片转存中…(img-H1p9qTSh-1712279117867)]

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

[外链图片转存中…(img-RE9C6ngl-1712279117867)]

  • Android BAT部分大厂面试题(有解析)

[外链图片转存中…(img-wsZPOAvv-1712279117867)]

好了,以上便是今天的分享,希望为各位朋友后续的学习提供方便。觉得内容不错,也欢迎多多分享给身边的朋友哈。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
转载请注明出处或者链接地址:https://www.qianduange.cn//article/12238.html
标签
评论
发布的文章

前端——12.表单标签

2024-06-21 00:06:57

src、href和url含义及区别

2024-06-21 00:06:56

CSS知识点大全

2024-06-21 00:06:16

JS垃圾回收机制(GC)

2024-06-21 00:06:03

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!