Introductie tot Popmotion Pointers and Physics

Welkom bij de Introductie tot Popmotion-lessenreeks. In deel 1 hebben we ontdekt hoe je tweens en keyframes kunt gebruiken om nauwkeurige, in de tijd geplande animaties te maken.

In deel 2 gaan we kijken naar pointer-tracking en op snelheid gebaseerde animaties.

Met het volgen van de aanwijzer kunnen we schuifbare productschappen, schuifregelaars met aangepaste waarde of slepen-en-neerzetten-interfaces maken.

Velocity-gebaseerde animaties verschillen van een op tijd gebaseerde animatie zoals tween omdat de primaire eigenschap die beïnvloedt hoe de animatie zich gedraagt, is snelheid. De animatie zelf kan even duren.

We zullen kijken naar de drie op snelheid gebaseerde animaties in Popmotion, de lenteverval, en fysica. We zullen de gebruiken snelheid van de aanwijzer-trackinganimatie om deze animaties te starten, en dat zal aantonen hoe op snelheid gebaseerde animaties boeiende en speelse gebruikersinterfaces kunnen creëren op een manier dat op tijd gebaseerde animaties eenvoudig niet kunnen.

Open eerst deze CodePen om mee te spelen.

Aanwijzer volgen

Popmotion biedt het wijzer functie om de coördinaten van een muisaanwijzer of een aanraakaanwijzer bij te houden en uit te voeren.

Laten we dit samen met importeren styler, waarmee we de positie van de bal kunnen bepalen.

const pointer, styler = popmotion; const ball = document.querySelector ('. ball'); const ballStyler = styler (bal);

Voor dit voorbeeld willen we de bal slepen. Laten we een gebeurtenis toevoegen die de positie van de aanwijzer naar de bal uitvoert:

laat pointerTracker; const startTracking = () => pointerTracker = pointer (). start (ballStyler.set); ; ball.addEventListener ('mousedown', startTracking); ball.addEventListener ('touchstart', startTracking);

We willen ook dat een code stopt met traceren wanneer we de bal loslaten:

const stopTracking = () => pointerTracker && pointerTracker.stop (); document.addEventListener ('mouseup', stopTracking); document.addEventListener ('touchend', stopTracking);

Als je de bal nu probeert te slepen, is er een duidelijk probleem. De bal springt weg wanneer we hem aanraken! Geen geweldige gebruikerservaring.

Dit komt omdat, standaard, wijzer geeft de positie van de aanwijzer door ten opzichte van de pagina.

De positie van de aanwijzer uitvoeren ten opzichte van een ander punt, in dit geval de x / y-transformatie van de bal, kunnen we eenvoudig die positie doorgeven aan wijzer zoals dit:

const startTracking = () => pointerTracker = pointer (x: ballStyler.get ('x'), y: ballStyler.get ('y')). start (ballStyler.set); ;

Nu heb je de bal gemaakt, in slechts enkele regels code, versleepbaar! Wanneer de gebruiker de bal loslaat, stopt deze echter dood.

Dit voldoet niet: stel je een scrollbare carrousel voor van producten die een gebruiker kan slepen om te scrollen. Als het gewoon dood zou stoppen in plaats van met momentum scrollen, zou het minder plezierig zijn om te gebruiken.

Het zou ook moeilijker zijn, omdat de totale fysieke inspanning die nodig is om door de carrousel te bladeren hoger zou zijn.

Om animaties als deze in te schakelen, moeten we eerst de snelheid van het object dat wordt gegooid.

Spoorsnelheid

Popmotion biedt een functie die ons kan helpen om de snelheid te volgen. Het heet waarde. Laten we dat importeren:

const pointer, styler, value = popmotion;

Om een ​​moment technisch te spreken, zijn alle animaties van Popmotion bekend acties. Acties zijn reactieve informatiestromen die kunnen worden gestart en gestopt.

EEN waarde is, omgekeerd, een reactie. Het kan niet worden gestopt of gestart. Het reageert gewoon passief wanneer het bijwerken methode wordt genoemd. Het kan de waarden bijhouden en kan worden gebruikt om hun snelheid op te vragen.

Dus, nadat we het hebben gedefinieerd ballStyler, laten we een nieuw definiëren waarde voor ballXY:

const ballXY = waarde (x: 0, y: 0);

telkens als ballXY updates die we willen updaten ballStyler. We kunnen een tweede argument doorgeven waarde, een functie die altijd wordt uitgevoerd ballXY updates:

const ballXY = waarde (x: 0, y: 0, ballStyler.set);

Nu kunnen we onze herschrijven wijzer updaten ballXY in plaats van ballStyler.set:

const startTracking = () => pointer (ballXY.get ()) .start (ballXY); ;

Nu kunnen we bij elke aanwijzer bellen ballXY.getVelocity () en we zullen de snelheden van beide ontvangen X en Y, klaar om te pluggen in onze op snelheid gebaseerde animaties.

Op snelheid gebaseerde animaties

de lente

De eerste op snelheid gebaseerde animatie om te introduceren is de lente. Het is gebaseerd op dezelfde vergelijkingen die van toepassing zijn op Apple's CASpringAnimation, de lente-animatie achter al die iOS-achtige speelsheid.

Importeren:

const pointer, spring, styler, value = popmotion;

Nu, wijzigen stopTracking zodat in plaats van het stoppen van de pointerTracker animatie, het begint a de lente animatie zoals deze:

const stopTracking = () => spring (from: ballXY.get (), velocity: ballXY.getVelocity (), to: 0, stijfheid: 100, demping: 20). start (ballXY);

We bieden hem de huidige positie van de bal, zijn snelheid en een doelwit en de simulatie wordt uitgevoerd. Het verandert afhankelijk van hoe de gebruiker de bal heeft gegooid.

Het leuke aan veren is dat ze expressief zijn. Door de massa-stijfheid en demping eigenschappen, kunt u eindigen met radicaal verschillende veergevoelens.

Bijvoorbeeld als u alleen de stijfheid hierboven naar 1000, je kunt een beweging creëren die aanvoelt als energiek knappen. Vervolgens door te veranderen massa- naar 20, je creëert beweging die bijna lijkt op zwaartekracht.

Er is een combinatie die goed en bevredigend zal aankomen voor uw gebruikers en past bij uw merk, onder vrijwel elke omstandigheid. Door te spelen met verschillende veergevoeligheden, kunt u verschillende gevoelens overbrengen, zoals een strikte out-of-bounds-breuk of een zachtere bevestigende bounce..

verval

De verval animatie, zoals de naam doet vermoeden, verval de aangeleverde snelheid, zodat de animatie geleidelijk vertraagt ​​tot een volledige stop.

Dit kan worden gebruikt om het momentum-scrolleffect op smartphones te creëren, zoals dit:

Importeer de verval functie:

const decay, pointer, spring, styler, value = popmotion;

En vervang de stopTracking functie met het volgende:

const stopTracking = () => verval (van: ballXY.get (), velocity: ballXY.getVelocity ()). start (ballXY);

verval berekent automatisch een nieuw doel op basis van het geleverde van en snelheid rekwisieten.

Het is mogelijk om het gevoel van de vertraging aan te passen door te knoeien met de rekwisieten die zijn beschreven in de documenten die hierboven zijn gelinkt, maar in tegenstelling tot de lente en fysicaverval is ontworpen om uit de doos te werken. 

fysica

Eindelijk hebben we de fysica animatie. Dit is Popmotion's Zwitserse zakmes van op snelheid gebaseerde animaties. Hiermee kun je:

  • constante snelheid
  • versnelling
  • springs
  • wrijving

de lente en verval bieden een supernauwkeurige beweging en een breder scala aan 'aanrakingen'. Binnenkort zullen ze allebei ook schrobbaar zijn.

Maar beide zijn onveranderlijk. Als u eenmaal bent begonnen, worden hun eigenschappen in steen gezet. Perfect voor wanneer we een animatie willen starten op basis van de initiaal van/snelheid staat, maar niet zo goed als we permanente interactie willen.

fysica, in plaats daarvan is het een geïntegreerde simulatie dichter bij dat van een videogame. Het werkt door, eenmaal per frame, de huidige status te nemen en vervolgens te wijzigen op basis van de huidige eigenschappen op dat moment.

Dit staat het toe veranderlijk, wat betekent dat we die eigenschappen kunnen wijzigen, wat vervolgens de uitkomst van de simulatie verandert.

Om dit te demonstreren, maken we een draai aan klassieke pointer smoothing, met elastische smoothing.

Importeren fysica:

const pointer, spring, physics, styler, value = popmotion;

Deze keer gaan we het veranderen startTracking functie. In plaats van veranderen ballXY met wijzer, we zullen gebruiken fysica:

const startTracking = () => const physicsAnimation = physics (van: ballXY.get (), to: ballXY.get (), velocity: ballXY.getVelocity (), restSpeed: false, friction: 0.6, springStrength: 400 ) .start (ballXY); ;

Hier gaan we zitten van en snelheid zoals normaal. wrijving en springStrength beide passen de eigenschappen van de veer aan.

restSpeed: false overschrijft het standaardgedrag van de animatie die stopt wanneer de beweging stopt. We willen het handmatig stoppen stopTracking.

Op zichzelf zal deze animatie niets doen omdat we ingesteld hebben naar, het doelwit van de lente, naar dezelfde als van. Dus laten we het opnieuw implementeren wijzer deze tijd volgen om het lentedoel van te veranderen fysica. Op de laatste regel van startTracking, toevoegen:

pointerTracker = pointer (ballXY.get ()). start ((v) => physicsAnimation.setSpringTarget (v););

Hier gebruiken we een soortgelijke wijzer animatie zoals eerder. Behalve deze keer gebruiken we het om het doelwit van een andere animatie te wijzigen. Door dit te doen, creëren we deze elastische aanwijzer-tracking:

Conclusie

Op snelheid gebaseerde animaties gecombineerd met het volgen van de aanwijzer kunnen boeiende en speelse interfaces creëren.

de lente kan worden gebruikt om een ​​breed scala aan lente-gevoel te creëren, terwijl verval is speciaal afgestemd op momentum scroll-animaties. fysica is beperkter dan wat betreft de configureerbaarheid, maar biedt ook de mogelijkheid om de lopende simulatie te wijzigen en nieuwe interactiemogelijkheden te openen.

In het volgende en laatste deel van deze introductiereeks over Popmotion gaan we alles opnemen wat we hebben geleerd in de eerste twee delen en deze samen met een aantal lichte functionele composities gebruiken om een ​​scrubbbare animatie te maken, samen met een scrubber om te doen het schrobben met!