微信小程序小组件 基于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获取并操作iframe中元素的方法
Mar 21 Javascript
js跳转页面方法总结
Jan 29 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
Mar 12 Javascript
JSON 数据详解及实例代码分析
Jan 20 Javascript
BootStrap 表单控件之单选按钮水平排列
May 23 Javascript
JsChart组件使用详解
Mar 04 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
Vue-cli@3.0 插件系统简析
Sep 05 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 Javascript
Vue 的双向绑定原理与用法揭秘
May 06 Javascript
js实现轮播图效果 纯js实现图片自动切换
Aug 09 Javascript
微信小程序自定义底部弹出框动画
Nov 18 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
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python如何实现机器人聊天
2020/09/10 Python
Python通过format函数格式化显示值
2020/10/17 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
你们项目是如何进行变更控制的
2015/08/26 面试题
最新结婚典礼主持词
2014/03/14 职场文书
培训班主持词
2014/03/28 职场文书
教师节倡议书
2014/08/30 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
Docker部署Mysql8的实现步骤
2022/07/07 Servers