微信小程序小组件 基于Canvas实现直播点赞气泡效果


Posted in Javascript onMay 29, 2020

先发Canvas实现直播点赞气泡效果图:

微信小程序小组件 基于Canvas实现直播点赞气泡效果

实现细节:

1.JS:

drawImage:function(data){[/align]
  var that = this
  var p10= data[0][0]; /* 三阶贝塞尔曲线起点坐标值*/
  var p11= data[0][1]; /* 三阶贝塞尔曲线第一个控制点坐标值*/
  var p12= data[0][2]; /* 三阶贝塞尔曲线第二个控制点坐标值*/
  var p13= data[0][3]; /* 三阶贝塞尔曲线终点坐标值*/
  var p20= data[1][0];
  var p21= data[1][1];
  var p22= data[1][2];
  var p23= data[1][3];
  var p30= data[2][0];
  var p31= data[2][1];
  var p32= data[2][2];
  var p33= data[2][3];
  var t = factor.t;
  /*计算多项式系数 (下同)*/ 
  var cx1 = 3*(p11.x-p10.x);
  var bx1 = 3*(p12.x-p11.x)-cx1;
  var ax1 = p13.x-p10.x-cx1-bx1;
  var cy1 = 3*(p11.y-p10.y);
  var by1 = 3*(p12.y-p11.y)-cy1;
  var ay1 = p13.y-p10.y-cy1-by1;
  var xt1 = ax1*(t*t*t)+bx1*(t*t)+cx1*t+p10.x;
  var yt1 = ay1*(t*t*t)+by1*(t*t)+cy1*t+p10.y;
  var cx2 = 3*(p21.x-p20.x);
  var bx2 = 3*(p22.x-p21.x)-cx2;
  var ax2 = p23.x-p20.x-cx2-bx2;
  var cy2 = 3*(p21.y-p20.y);
  var by2 = 3*(p22.y-p21.y)-cy2;
  var ay2 = p23.y-p20.y-cy2-by2;
  var xt2 = ax2*(t*t*t)+bx2*(t*t)+cx2*t+p20.x;
  var yt2 = ay2*(t*t*t)+by2*(t*t)+cy2*t+p20.y;
  var cx3 = 3*(p31.x-p30.x);
  var bx3 = 3*(p32.x-p31.x)-cx3;
  var ax3 = p33.x-p30.x-cx3-bx3;
  var cy3 = 3*(p31.y-p30.y);
  var by3 = 3*(p32.y-p31.y)-cy3;
  var ay3 = p33.y-p30.y-cy3-by3;
  /*计算xt yt的值 */
  var xt3 = ax3*(t*t*t)+bx3*(t*t)+cx3*t+p30.x;
  var yt3 = ay3*(t*t*t)+by3*(t*t)+cy3*t+p30.y;
  factor.t +=factor.speed;
  ctx.drawImage("../../images/heart1.png",xt1,yt1,30,30);
  ctx.drawImage("../../images/heart2.png",xt2,yt2,30,30);
  ctx.drawImage("../../images/heart3.png",xt3,yt3,30,30);
  ctx.draw();
  if(factor.t>1){
   factor.t=0;
   cancelAnimationFrame(timer);
   that.startTimer();
  }else{
   timer =requestAnimationFrame(function(){
    that.drawImage([[{x:30,y:400},{x:70,y:300},{x:-50,y:150},{x:30,y:0}],[{x:30,y:400},{x:30,y:300},{x:80,y:150},{x:30,y:0}],[{x:30,y:400},{x:0,y:90},{x:80,y:100},{x:30,y:0}]])
   })
  }}

2.原理:

a.通过绘制三条不同的三阶贝塞尔曲线,选取三张图片让其沿着各自的贝塞尔曲线运动,运动轨迹如下图:

微信小程序小组件 基于Canvas实现直播点赞气泡效果

b.计算三阶贝塞尔曲线x(t),y(t)的数学表达式。

三阶贝塞尔曲线是通过四个点来形成一条曲线,两个控制点,一个起点一个终点。

利用多项式系数即可得到x(t),y(t)的数学表达式:

cx = 3 * ( x1 - x0 )
bx = 3 * ( x2 - x1 ) - cx
ax = x3 - x0 - cx - bx
cy = 3 * ( y1 - y0 )  
by = 3 * ( y2 - y1 ) - cy
ay = y3 - y0 - cy - by
x(t) = ax * t ^ 3 + bx * t ^ 2 + cx * t + x0
y(t) = ay * t ^ 3 + by * t ^ 2 + cy * t + y0

这里画了三条贝塞尔曲线,套用公式三次即可,这里没有采用循环,如果贝塞尔曲线条数比较多时,可采用循环调用 ctx.drawImage,其中factor.t为三阶贝塞尔曲线的参数,取值范围[0,1], 最后调用ctx.draw(),并且设置定时器即可实现图片沿着贝塞尔曲线运动。

3.Tip:

这里采用的定时器是通过requestAnimationFrame()函数实现的, 弃用setInterval的原因是实际测试中有卡帧现象并且动画显示有细微的不连续。

项目地址:

github:https://github.com/jeffer0323/We-Canvas

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中的一些注意事项 更新中
Dec 06 Javascript
jquery选择器大全 全面详解jquery选择器
Mar 06 Javascript
node.js中的fs.rmdirSync方法使用说明
Dec 16 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
javascript验证邮件地址和MX记录的方法
Jun 16 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
js实现html table 行,列锁定的简单实例
Oct 13 Javascript
基于vuejs+webpack的日期选择插件
May 21 Javascript
React 组件间的通信示例
Jun 14 Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 Javascript
Bootstrap中data-target 到底是什么
Feb 14 #Javascript
详解JS: reduce方法实现 webpack多文件入口
Feb 14 #Javascript
如何快速上手Vuex
Feb 14 #Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
Feb 14 #Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
Feb 14 #Javascript
Vue组件开发初探
Feb 14 #Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 #Javascript
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
php中cookie的作用域
2008/03/27 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
php中给js数组赋值方法
2014/03/10 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript函数详解
2015/02/27 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python urlopen 使用小示例
2008/09/06 Python
python实现排序算法
2014/02/14 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
新护士岗前培训制度
2014/02/02 职场文书
平面设计师岗位职责
2014/09/18 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
财产保全担保书
2015/01/20 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
工程质量保证书
2015/05/09 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python