JS Canvas实现QQ未接通电话动画特效

作者:像素猫

时间:2026-10-22

浏览:208

本文介绍如何使用HTML5 Canvas和JavaScript实现类似QQ未接通电话时的动画特效。通过解析贝塞尔曲线原理,利用Canvas坐标系特性,结合定时器与图形保存恢复机制,绘制出流畅的声波动画效果。

文章目录

QQ未接通电话动画特效展示

首先展示一下最终的特效演示。视频由手机直接录制,画质可能不够清晰,敬请谅解。

QQ未接通电话动画特效展示

原本计划制作腾讯贝塞尔曲线下拉刷新效果,但在与朋友进行QQ通话时,观察到未接通状态下的动画设计,由此萌生了复现该动画的想法。

在实现过程中,需要特别注意以下关键点:

当Canvas中心点经过变换移至Canvas正中心后,需注意坐标系的差异:Canvas的Y轴方向是从上到下由负变正(-,+);而数学坐标系中Y轴从上到下是由正变负(+,-)。

HTML结构实现

首先查看HTML代码部分。代码非常简洁,仅包含一个基本的Canvas元素,未进行其他复杂操作。

HTML代码

<canvas id="canvas1" width="500" height="500"></canvas>

JS代码

JavaScript核心逻辑与注意事项


var paint, r;    //设置画笔和半径
var width, height; //获得canvas的长度和宽度
var count = 0;   //设置正铉曲线的便宜量
var colors = ["#66ccff", "#ff0000"];

/*程序入口*/
function main() {
  var canvas1 = document.getElementById("canvas1");
  paint = canvas1.getContext("2d");
  width = paint.canvas.width;
  height = paint.canvas.height;
  r = width / 2;
  start();
  setInterval(start, 200);
}

/*开始进行清除和绘制*/
function start() {
  paint.clearRect(0, 0, width, height);
  drawXY();
  drawSin();
  paint.restore();
}

/*绘制一个坐标系*/
function drawXY() {
  paint.save();
  paint.translate(r, r);
  paint.beginPath();
  paint.lineWidth = 1;
  paint.moveTo(0, -r);
  paint.lineTo(0, r);
  paint.stroke();

  paint.lineWidth = 1;
  paint.moveTo(-r, 0);
  paint.lineTo(r, 0);
  paint.stroke();
}

/*正弦曲线可表示为y=Asin(ωx+φ)+k,定义为函数y=Asin(ωx+φ)+k在直角坐标系上的图象,*/

/*绘制sin正弦图像*/
function drawSin() {
  paint.save();
  count++;//设置每一刻的偏移量
  var i, j, rad, y;
  for (j = 0; j < 2; j++) {
    for (i = -1000; i < 1000; i++) {
      paint.beginPath();
      paint.strokeStyle = colors[j];
      rad = i * Math.PI / 180;
      y = -20 * Math.sin(rad - (count + j));
      paint.arc(i, y, 0.3, 0, 2 * Math.PI, false);
      paint.stroke();
    }
  }

  paint.restore();
}

JavaScript部分的关键在于:在通过计时器动态改变图像时,必须先执行清除操作。随后,必须对绘制过的图像进行保存和恢复处理,否则程序可能出现图像重叠或无法显示等Bug。

此处定义的paint变量名是沿用了Android绘图的习惯命名方式。

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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章