2011-09-18 3 views
3

Je dessine une horloge non-traditionnelle dans la toile. L'heure est représentée par une deuxième sonnerie, une seconde main, une minute et une heure. J'utilise webkit/mozRequestAnimationFrame pour dessiner au bon moment. Je voudrais modifier la deuxième sonnerie pour l'animer rapidement (125ms - 250ms) et avec l'accélération Quadratic (au lieu de ce snap redouté).Arc de toile animée avec accélération

Tout comme le Raphael JS Horloge anime son deuxième anneau, sauf qu'il utilise différents assouplissement: http://raphaeljs.com/polar-clock.html

JS Fiddle Liens (doit voir dans Chrome, Firefox ou Webkit nuit):

  1. Fiddle : http://jsfiddle.net/thecrypticace/qmwJx/

  2. plein écran Fiddle: http://jsfiddle.net/thecrypticace/qmwJx/embedded/result/

Toute aide serait grandement appréciée!

Cela se rapproche, mais est toujours très saccadé:

var startValue; 
if (milliseconds < 500) { 
    if (!startValue) startValue = milliseconds; 
    if (milliseconds - startValue <= 125) { 
     animatedSeconds = seconds - 0.5 + Math.easeIn(milliseconds - startValue, startValue, 1000 - startValue, 125)/1000; 
    } else { 
     animatedSeconds = seconds; 
    } 
    drawRing(384, 384, 384, 20, animatedSeconds/60, 3/2 * Math.PI, false); 
} else { 
    drawRing(384, 384, 384, 20, seconds/60, 3/2 * Math.PI, false);   
    startValue = 0; 
} 
+2

... aide avec quoi? ;-). Vous devez épeler votre question ici, pas seulement un lien vers un Fiddle ... –

+1

Je l'ai dit ici: "modifier la deuxième sonnerie pour animer ... au lieu de snap ..." Fondamentalement, je veux juste ajouter une animation à la seconde bague donc, au lieu de simplement afficher la valeur suivante, il s'anime bien. – TheCrypticAce

Répondre

1

Il est une mater de mathématiques:

drawRing(384, 384, 384, 20, seconds/60, 3/2 * Math.PI, false); 

Ceci est la ligne qui dessine le cercle de secondes. Donc, le problème est que dans un moment donné, vous avez quelque chose comme 34/60, 35/60 et ainsi de suite. Cela signifie que votre cercle de secondes est de 60/60, n'utilisant pas les millisecondes, et le dessin chaque seconde. La solution d'assouplissement linéaire: faites cadrer votre seconde de 60 000/60 000 -> 60 secondes par 1000 millisecondes chacune. Et le calcul:

drawRing(384, 384, 384, 20, ((seconds*1000)+milliseconds)/60000, 3/2 * Math.PI, false); 

The In solution Out Quadric ou choisir un these:

Math.easeInOutQuad = function (t, b, c, d) { 
    t /= d/2; 
    if (t < 1) return c/2*t*t + b; 
    t--; 
    return -c/2 * (t*(t-2) - 1) + b; 
}; 

J'optimisé et changé votre code:

//+1 animation happens before the second hand 
//-1 animation happens after the second hand 
animatedSeconds = seconds+1; 
if (milliseconds > 10) { 
    if (!startValue) { startValue = milliseconds; } 
    if (milliseconds - startValue <= 100) { 
     animatedSeconds -= -0.5+ Math.easeInOutQuad(milliseconds - startValue, startValue, 1000 - startValue, 125)/1000; 
    } 
} else { 
    startValue = 0; 
} 
drawRing(384, 384, 384, 20, animatedSeconds/60, 3/2 * Math.PI, false); 

Espérons que c'est ce que vous cherchez pour.

+0

Ceci est proche de ce que je veux. Cependant, je le fais déjà pour la seconde main. En outre, il ne redessine pas chaque milliseconde, Google requestAnimationFrame pour savoir pourquoi (le navigateur contrôle la boucle d'animation). Mon problème est que j'ai besoin d'animer la deuxième bague comme l'exemple Raphael JS Polar Clock. De la seconde à la seconde, il y a une animation rapide, qui prend moins d'une seconde à compléter, pour dessiner la seconde suivante sur le ring. – TheCrypticAce

+0

Ajouté dans quelque chose que j'ai expérimenté, c'est proche, mais pas tout à fait, car l'animation est vraiment saccadée. JS Fiddle a également mis à jour l'exemple avec un nouveau code. – TheCrypticAce

+0

J'ai mis à jour ma réponse j'espère que c'est ça. – Bakudan