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

2、首先我利用了一个以前写的canvas辅助类,留下来今天要用的一些方法:

/**

  • Created with JetBrains WebStorm.

  • User: zhy

  • Date: 13-12-17

  • Time: 下午9:42

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

*/

function Canvas2D($canvas)

{

var context = $canvas[0].getContext(“2d”),

width = $canvas[0].width,

height = $canvas[0].height,

pageOffset = $canvas.offset();

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

context.textBaseline = “top”;

/**

  • 绘制矩形

  • @param start

  • @param end

  • @param isFill

*/

this.drawRect = function (start, end, isFill)

{

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;

}

};

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

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

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

img

img

img

img

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

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

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

最后

在此为大家准备了四节优质的Android高级进阶视频:

架构师项目实战——全球首批Android开发者对Android架构的见解

附相关架构及资料

image.png

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

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

12279152846)]

[外链图片转存中…(img-7K6QU6bK-1712279152847)]

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

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

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

最后

在此为大家准备了四节优质的Android高级进阶视频:

架构师项目实战——全球首批Android开发者对Android架构的见解

附相关架构及资料

[外链图片转存中…(img-Jp3PZO98-1712279152847)]

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现地球绕太阳公转,可以使用HTML5canvas标签和CSS3的animation属性。 首先,在HTML中创建一个canvas标签,并设置其宽度和高度: ```html <canvas id="canvas" width="600" height="600"></canvas> ``` 然后,使用JavaScript获取canvas元素并获取其上下文: ```javascript var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ``` 接下来,我们需要绘制太阳和地球。可以使用canvas的arc方法绘制圆形: ```javascript // 绘制太阳 ctx.fillStyle = "yellow"; ctx.beginPath(); ctx.arc(300, 300, 50, 0, Math.PI * 2); ctx.fill(); // 绘制地球 ctx.fillStyle = "blue"; ctx.beginPath(); ctx.arc(150, 300, 20, 0, Math.PI * 2); ctx.fill(); ``` 现在,我们需要使用CSS3的animation属性来实现地球绕太阳公转。我们可以使用以下样式: ```css #canvas { animation: rotation 10s linear infinite; } @keyframes rotation { from { transform: rotate(0); } to { transform: rotate(360deg); } } ``` 这将使canvas元素在10秒钟内旋转360度,并且动画将无限循环。 完整的HTML和CSS代码如下所示: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>地球绕太阳公转</title> <style> #canvas { animation: rotation 10s linear infinite; } @keyframes rotation { from { transform: rotate(0); } to { transform: rotate(360deg); } } </style> </head> <body> <canvas id="canvas" width="600" height="600"></canvas> <script> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); // 绘制太阳 ctx.fillStyle = "yellow"; ctx.beginPath(); ctx.arc(300, 300, 50, 0, Math.PI * 2); ctx.fill(); // 绘制地球 ctx.fillStyle = "blue"; ctx.beginPath(); ctx.arc(150, 300, 20, 0, Math.PI * 2); ctx.fill(); </script> </body> </html> ``` 希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值