微信小程序小组件 基于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 相关文章推荐
犀利的js 函数集合
Jun 11 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
May 10 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
Jan 13 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
分析Node.js connect ECONNREFUSED错误
Apr 09 Javascript
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
js中widow.open()方法使用详解
Jul 30 Javascript
jQuery 事件的命名空间简单了解
Nov 22 Javascript
Javascript中String的常用方法实例分析
Jun 13 Javascript
AJAX和jQuery动态加载数据的实现方法
Dec 05 Javascript
jQuery插件Validation表单验证详解
May 26 jQuery
详解JavaScript 的变量
Mar 08 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
浅谈Node.js:Buffer模块
2016/12/05 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
Python中的字典遍历备忘
2015/01/17 Python
Python入门之modf()方法的使用
2015/05/15 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
python入门教程之识别验证码
2017/03/04 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
python保存文件方法小结
2018/07/27 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
有原因的手表:Flex Watches
2019/03/23 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
污水厂厂长岗位职责
2014/01/04 职场文书
开业典礼主持词
2014/03/21 职场文书
公司奖励通知
2015/04/21 职场文书
2015公司年度工作总结
2015/05/14 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
Python借助with语句实现代码段只执行有限次
2022/03/23 Python