微信小程序小组件 基于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
Feb 25 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
Feb 23 Javascript
JS获取地址栏参数的小例子
Aug 23 Javascript
取得元素的左和上偏移量的方法
Sep 17 Javascript
JavaScript通过事件代理高亮显示表格行的方法
May 27 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
JavaScript必知必会(三) String .的方法来自何方
Jun 08 Javascript
浅谈几种常用的JS类定义方法
Jun 08 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
从零学习node.js之mysql数据库的操作(五)
Feb 24 Javascript
javascript数组去重常用方法实例分析
Apr 11 Javascript
JavaScript格式化json和xml的方法示例
Jan 22 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
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
php 伪静态之IIS篇
2014/06/02 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
PHP 裁剪图片
2021/03/09 PHP
javascript 弹出层组件(升级版)
2011/05/12 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
移动端js图片查看器
2016/11/17 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
Python实现的多线程端口扫描工具分享
2015/01/21 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
银行工作检查书范文
2014/01/31 职场文书
人事助理自荐信
2014/02/02 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
教师个人年终总结
2015/02/11 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书