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

发布时间 - 2026-01-10 23:02:27    点击率:

先发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.通过绘制三条不同的三阶贝塞尔曲线,选取三张图片让其沿着各自的贝塞尔曲线运动,运动轨迹如下图:

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

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


# 微信小程序点赞  # 微信小程序组件  # Canvas直播点赞气泡  # 微信小程序 vidao实现视频播放和弹幕的功能  # 微信小程序之video组件视频播放  # 微信小程序使用视频播放器video组件  # 微信小程序开发中的视频播放和直播功能示例代码  # 塞尔  # 坐标值  # 三条  # 第一个  # 中有  # 第二个  # 让其  # 画了  # 大家多多  # 三张  # 如下图  # 先发  # 条数  # 为三  # 不连续  # factor  # JS  # strong  # brush  # class 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何与Inertia.js和Vue/React构建现代单页应用  如何用VPS主机快速搭建个人网站?  网站制作软件有哪些,制图软件有哪些?  Python3.6正式版新特性预览  如何在景安服务器上快速搭建个人网站?  如何快速完成中国万网建站详细流程?  中国移动官方网站首页入口 中国移动官网网页登录  长沙做网站要多少钱,长沙国安网络怎么样?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  JavaScript模板引擎Template.js使用详解  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  太平洋网站制作公司,网络用语太平洋是什么意思?  如何在服务器上配置二级域名建站?  JS中对数组元素进行增删改移的方法总结  长沙企业网站制作哪家好,长沙水业集团官方网站?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Linux系统命令中tree命令详解  打造顶配客厅影院,这份100寸电视推荐名单请查收  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何在Windows服务器上快速搭建网站?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  JS去除重复并统计数量的实现方法  SQL查询语句优化的实用方法总结  JS碰撞运动实现方法详解  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  网站建设整体流程解析,建站其实很容易!  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  高端建站如何打造兼具美学与转化的品牌官网?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何快速生成可下载的建站源码工具?  详解jQuery停止动画——stop()方法的使用  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  韩国服务器如何优化跨境访问实现高效连接?  javascript中闭包概念与用法深入理解  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  如何快速搭建高效服务器建站系统?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  香港服务器租用费用高吗?如何避免常见误区?  如何快速配置高效服务器建站软件?  linux top下的 minerd 木马清除方法