Comment dessiner des lignes verticales en tant que piste musicale progressbar en utilisant Canvas en Javascript


J'essaie de créer un lecteur audio personnalisé. J'utilise HtmlAudioElement pour cela. J'ai réussi à jouer, mettre en pause, afficher la durée et tout, mais je suis resté là où je dois afficher une barre de progression lors de la lecture d'une piste. J'ai une valeur en pourcentage (combien de chanson déjà jouée) qui se met à jour toutes les millisecondes. Je me demandais en utilisant cette valeur de pourcentages puis-je utiliser canvas et dessiner des lignes verticales à mesure que le pourcentage augmente?

entrez la description de l'image ici

Voici donc comment la barre de progression doit changer de couleur à mesure que le pourcentage augmente. Je n'ai aucune idée par où commencer. Je suis très nouveau à la toile. Toute Aide ?

J'ai essayé cela jusqu'à présent. ( Ce n'est pas ce que je veux) .

const canvas = document.getElementById('progress');
canvas.width = 1920;
canvas.height = 100;
const ctx = canvas.getContext('2d');

ctx.fillStyle = 'grey';

for(let i = 0; i < 1000; i+=10){
    console.log(i);
    ctx.fillRect(i,0,5,100);
}

let count = 0;
let percent = 0;
ctx.fillStyle = 'orange';

function draw(){
    console.log('Hello')
    ctx.fillRect(count,0,5,100);
    count+=10;
    if(count > 100/1){
        return;
    }
    window.requestAnimationFrame(draw);
}

draw();

entrez la description de l'image ici

Donc c'est ce qu'il ressemble en ce moment.

Je veux en jouant des changements de pourcentage, j'ai besoin d'accrocher cette valeur quelque part dans le Canevas afin que je puisse dessiner ces lignes.

Merci d'avance :)

Author: Vishwas R, 2020-02-14

1 answers

Vous pouvez lire la valeur (% done) directement à partir de l'objet média qui la contient.

Je ne peux pas entraîner ce que c'est que vous avez des problèmes avec. vous mentionnez la couleur ce qui suit est une simple barre de changement de couleur.

Barre de progression de base

Quelques constantes pour définir la barre de progression

const width = 500;
const height = 20;
const startColor = {r: 255, g: 128, b: 0}; // unsigned byte values 0 - 255
const endColor = {r: 255, g: 128, b: 0};

Pour interpoler la couleur

function progressColor(start, end, progress) {
    const r = (end.r - start.r) * progress + start.r;
    const g = (end.g - start.g) * progress + start.g;
    const b = (end.b - start.b) * progress + start.b;
    return `rgb(${r | 0},${g |0 }, ${b | 0})`;
}

Pour dessiner la barre

function progressBar(progress) {
    ctx.fillStyle =  progressColor(startColor, endColor, progress);
    // whatever design you want the example is just a simple bar

    ctx.fillRect(0,0, width * progress, height);
}

La boucle principale

  • La boucle principale toutes les 60 secondes.

  • Si l'audio est en pause, il s'arrête.

  • Lors du démarrage de la boucle d'animation, il faut veiller à ne pas la démarrer plus d'une fois

  • Notez que l'audio se sera arrêté jusqu'à ~1/60e de seconde avant le rendu de la dernière image d'animation.

La boucle d'animation principale...

var progressAnimating = false;  // this is to avoid more that one mainLoop playing
function mainLoop() {
    ctx.clearRect(0,0,width,height);

    // draw backing bar here

    const fractionDone = audio.time / audio.duration;
    progressBar(fractionDone);

    // only while not paused
    if (!audio.paused) {
        requestAnimationFrame(mainLoop);
    } else {
        progressAnimating = false;  // flag that the animation has stopped
    }
}

Utilisez les événements audio pour démarrer l'animation

  • Utilisez l'événement de lecture audio pour démarrer l'animation.

  • Vérifiez pour vous assurer que l'animation ne joue pas avant que vous ne demandiez la première image.

  • Si l'animation est toujours active, alors il continuera par son auto -

.

audio.addEventListener("play",() => {
    if (!progressAnimating) {
        requestAnimationFrame(mainLoop);
        progressAnimating = true;
    }
});

Styliser la barre de progression

La fonction suivante remplace la barre solide par le haut. Il utilise la zone du clip pour limiter la largeur afin que vous n'ayez pas besoin de jouer avec des barres fractionnaires.

const barWidth = 4; // in px
const barSpacing = 8; // distance from left edge to next left edge in px

function progressBar(progress) {
    ctx.save(); // save the unclipped state

    ctx.beginPath(); // create the clip path
    ctx.rect(0,0, width * progress, height);
    ctx.clip();

    ctx.fillStyle =  progressColor(startColor, endColor, progress);

    ctx.beginPath(); // draw all bars as one
    var x = 0;
    while (x < width * progress) {
        ctx.rect(x, 0, barWidth, height);
        x += barSpacing;
    }
    ctx.fill(); // draw that bars

    ctx.restore(); // restore unclipped state
}
 1
Author: Blindman67, 2020-03-04 15:00:24