jQuery的画布动画,用圆圈填充文本

时间:2018-12-08 14:18:39

标签: javascript jquery html canvas

我正在尝试使用jquery和html编写气泡动画代码,以使圈子在画布中移动,并且文本应根据圈子的大小进行调整。

如何将文字放在这些圆圈上?

我在circle函数中使用填充文本,但这给我一个错误。

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = 300;
var mouse = {
x: undefined,
y: undefined
}
window.addEventListener('mousemove', function(e){
mouse.x = e.x;
mouse.y = e.y;
});
window.addEventListener('resize', function(){
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
function Circle(){
this.radius = getRandomInt(30);
this.originalSize = this.radius;
this.x = Math.random() * (innerWidth - this.radius * 2) + this.radius;
this.y = Math.random() * (innerHeight - this.radius * 2) + this.radius;
this.gradient = Math.random();
this.color = 'rgba('+ getRandomInt(255) +','+ getRandomInt(255) + ','+ getRandomInt(255) + ','+ this.gradient +')';    
this.xVelocity = 5 * (Math.random() - Math.random());
this.yVelocity = 5 * (Math.random() - Math.random());
this.draw = function(){
c.beginPath();
c.arc(this.x,this.y, this.radius, 0, Math.PI*2, false);
c.strokeStyle = this.color;
c.stroke();
c.fillStyle = this.color;
c.fill();
this.update();
}
this.update = function(){
if(this.x + this.radius > innerWidth || this.x - this.radius < 0){
this.xVelocity = -this.xVelocity;
}
if(this.y + this.radius > innerHeight || this.y - this.radius < 0){
this.yVelocity = -this.yVelocity;
}
this.x += this.xVelocity;
this.y += this.yVelocity;
if(mouse.x - this.x < 50 && mouse.x - this.x > -50 
                && mouse.y - this.y < 50 && mouse.y - this.y > -50){
if(this.radius < 150){
this.radius += 2;
}
}
else if(this.radius !== this.originalSize){
this.radius -= 2;
}
}
}
var circleArray = [];
for(var i = 0; i < 100; i++){
circleArray.push(new Circle());
}
function animate(){
c.clearRect(0,0, innerWidth, innerHeight);
for(var i = 0; i < circleArray.length; i++){
circleArray[i].draw();
}
requestAnimationFrame(animate);
}
animate();
<canvas class="grey darken-4" id="canvas" width="" height="">
</canvas>

screenshot of animation

1 个答案:

答案 0 :(得分:1)

我希望我能正确理解你。我添加了一个文本数组var textRy=["C", "C++", "JS", "java"];,该圆圈现在具有this.text属性。为了编写文本,我在this.draw方法中添加了几行,但是您可以将其全部放在单独的函数中。我已经将文字的大小设为this.radius的相对大小。

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;//300;

var textRy=["C", "C++", "JS", "java"];
 
var mouse = {
x: undefined,
y: undefined
}
window.addEventListener('mousemove', function(e){
mouse.x = e.x;
mouse.y = e.y;
});
window.addEventListener('resize', function(){
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}



function Circle(){
this.radius = getRandomInt(30);
this.originalSize = this.radius;
this.x = Math.random() * (innerWidth - this.radius * 2) + this.radius;
this.y = Math.random() * (innerHeight - this.radius * 2) + this.radius;
  
this.text = textRy[~~(Math.random() * textRy.length)];
  
this.gradient = Math.random();
this.color = 'rgba('+ getRandomInt(255) +','+ getRandomInt(255) + ','+ getRandomInt(255) + ','+ this.gradient +')';    
this.xVelocity = 5 * (Math.random() - Math.random());
this.yVelocity = 5 * (Math.random() - Math.random());
this.draw = function(){
c.beginPath();
c.arc(this.x,this.y, this.radius, 0, Math.PI*2, false);
c.strokeStyle = this.color;
c.stroke();
c.fillStyle = this.color;
c.fill();

 
c.textAlign="center";
c.textBaseline="middle";
c.font=(this.radius*.8)+"px Consolas";
c.fillStyle = "blue";
c.fillText(this.text,this.x,this.y);
      
  
this.update();
}
this.update = function(){
if(this.x + this.radius > innerWidth || this.x - this.radius < 0){
this.xVelocity = -this.xVelocity;
}
if(this.y + this.radius > innerHeight || this.y - this.radius < 0){
this.yVelocity = -this.yVelocity;
}
this.x += this.xVelocity;
this.y += this.yVelocity;
if(mouse.x - this.x < 50 && mouse.x - this.x > -50 
                && mouse.y - this.y < 50 && mouse.y - this.y > -50){
if(this.radius < 150){
this.radius += 2;
}
}
else if(this.radius !== this.originalSize){
this.radius -= 2;
}
}
}
var circleArray = [];
for(var i = 0; i < 100; i++){
circleArray.push(new Circle());
}
function animate(){
c.clearRect(0,0, innerWidth, innerHeight);
for(var i = 0; i < circleArray.length; i++){
circleArray[i].draw();
}
requestAnimationFrame(animate);
}
animate();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<canvas id="canvas"></canvas>