Dela via


Animering (DirectComposition)

Not

För appar i Windows 10 rekommenderar vi att du använder API:er för Windows.UI.Composition i stället för DirectComposition. Mer information finns i Modernisera din skrivbordsapp med hjälp av visualiseringsskiktet.

I det här avsnittet beskrivs grunderna i Microsoft DirectComposition-animering. Den innehåller följande avsnitt:

Vad är en animering?

Animering är en optisk illusion som skapas genom att snabbt göra inkrementella ändringar i ett visuellt objekt under en viss tidsperiod medan du ritar om det visuella objektet efter att varje ändring har gjorts. Eftersom redraws sker snabbt, uppfattar hjärnan de inkrementella förändringarna som en enda föränderlig scen, precis som i en film eller video av live-action.

I följande tabell beskrivs några av de vanliga sätten att använda animering.

Animation Beskrivning
Rullning Använd animering för att lägga till funktioner som fysikemulerande momentum i en rullningslistkontroll.
Scenövergångar Använd animering för att skapa navigeringsscenövergångar som ger kontinuitet mellan uppgifter i ett arbetsflöde. Navigeringsscenövergångar ger kontext som visar användaren var de har varit, var de är och vart de måste gå härnäst.
Interaktioner mellan fönster Animera gränssnittselement i olika program på ett sätt som ger en uppfattning om sömlös kontinuitet mellan dem för att hjälpa användaren att utföra uppgifter som innebär att växla från ett program till ett annat.

 

Egenskaper som kan animeeras

I DirectComposition animerar du ett visuellt objekt genom att använda animering för enskilda egenskaper för de objekt som definierar det visuella objektet. Om du till exempel vill flytta ett visuellt objekt vågrätt över skärmen använder du animering för egenskapen OffsetX för det visuella objektet. På samma sätt, om du vill göra en enkel animerad 2D-rotation av ett visuellt objekt, tillämpar du animering på egenskapen Angle för ett 2D-transformeringsobjekt och tillämpar sedan 2D-transformeringsobjektet på egenskapen Transformera för det visuella objektet.

Med DirectComposition kan du använda animering för alla objektegenskaper som tar ett skalärt värde. Du kan använda samtidiga animeringar för flera egenskaper och flera objekt.

DirectComposition kör animeringar i en separat tråd. Du kan starta en animering eller uppsättning animeringar och sedan utföra annat arbete med dina programtrådar, eller till och med försätta trådar i viloläge, medan kompositionsmotorn kör animeringarna med rätt bildfrekvens.

Animeringsfunktioner

DirectComposition animerar en objektegenskap baserat på en animeringsfunktion som du definierar. En animeringsfunktion är en konstruktion som anger hur värdet för en objektegenskap ändras under en viss tidsperiod. Du kan till exempel definiera en animeringsfunktion som ändrar värdet för en egenskap från 1 till 360 under loppet av 4 sekunder. Om du sedan använder animeringsfunktionen på egenskapen Angle för ett 2D-roterande transformeringsobjekt och sedan tillämpar transformeringsobjektet på egenskapen Transformera för ett visuellt objekt, roterar animeringsfunktionen det visuella objektet i en fullständig cirkel under loppet av 4 sekunder.

En animeringsfunktion representeras av ett animeringsobjekt skapat av ett anrop till metoden IDCompositionDevice::CreateAnimation. Du skapar en animeringsfunktion med hjälp av metoderna i ett animeringsobjekts IDCompositionAnimation--gränssnitt för att lägga till animeringssegment, en i taget, till matrisen som definierar animeringsfunktionen. När du lägger till ett segment anger du en nollbaserad förskjutning som markerar segmentets starttid i förhållande till början av animeringsfunktionen. Animeringssegment måste läggas till i ökande ordning efter starttider. Försök att lägga till ett animeringssegment vars starttid är före eller lika med ett föregående segment misslyckas. En animeringsfunktion kan ha en angiven sluttid som anger när funktionen ska avslutas.

Om inget annat anges startar en animeringsfunktion när Desktop Window Manager (DWM) tar emot kommandot för att köra animeringen. Varje segment körs tills starttiden för nästa segment har nåtts. Eventuella oavslutade ändringar som inträffar i värdet för den animerade egenskapen mellan segment anses vara diskreta ändringar.

Du använder en animeringsfunktion på en egenskap genom att ange egenskapsvärdet till IDCompositionAnimation pekaren för animeringsobjektet som representerar animeringsfunktionen. Samma animeringsobjekt kan tillämpas på flera egenskaper för samma objekt, samt på egenskaperna för andra objekt som skapats av samma enhet.

Animeringssegment

Animeringssegment är de grundläggande tidsdefinitionerna för en animeringsfunktion. De är de primitiver från vilka mer komplexa och högre animeringsfunktioner skapas. Ett animeringssegment skapas från en serie parametrar som beskriver funktionen och den tid då segmentet börjar, i förhållande till början av animeringsfunktionen. För varje segment fortsätter tiden (t) längs den vågräta axeln och börjar vid t = 0.

Kubiksegment

Tidpunkten för ett kubiksegment definieras av en kubikpolynom. För en viss tidsinmatning (t) anges utdatavärdet av följande ekvation:

x(t) = ³ + bt² + ct + d

Följande diagram visar en animeringsfunktion som innehåller två kubiksegment. Det första segmentet övergår ett värde från 0 till 16 över 4 sekunder och det andra ändrar värdet linjärt från 16 till 0 under de kommande 4 sekunderna. Den första övergången sker längs denna kubikpolynom:

x(t) = t³ - 6t² + 12t

och den andra övergången sker längs den här:

x(t) = - 4t + 16

diagram över en animeringsfunktion med två kubiksegment

Du lägger till ett kubiksegment i en animeringsfunktion med hjälp av metoden IDCompositionAnimation::AddCubic.

Sinusoidalt segment

Tidpunkten för ett sinusoidalt segment definieras av följande ekvation:

x(t) = Bias + Amplitude * sin(t*Frequency*2*PI + Phase*PI/180.0)

Du lägger till ett sinusoidalt segment i en animeringsfunktion med hjälp av metoden IDCompositionAnimation::AddSinusoidal.

Upprepa segment

Ett upprepat segment upprepar en angiven föregående del av en animeringsfunktion. Ett upprepat segment gör att den angivna delen av animeringsfunktionen loopas på obestämd tid tills nästa segment påträffas eller den angivna änden av animeringen har nåtts. Den föregående delen av en animering består av andra segment, inklusive andra upprepningssegment. Det går inte att använda ett upprepat segment som det första segmentet i en animeringsfunktion.

I följande diagram visas en animeringsfunktion som består av två kubiksegment med 4 sekunders varaktighet vardera, följt av ett upprepat segment som varar i 12 sekunder. Upprepningssegmentet börjar 8 sekunder in i animeringen och upprepar de föregående 6 sekunderna av animeringen två gånger tills slutsegmentet har nåtts vid 20 sekunder.

diagram över en animeringsfunktion som innehåller två kubiksegment och ett upprepat segment

Om du vill lägga till ett upprepat segment i en animeringsfunktion använder du metoden IDCompositionAnimation::AddRepeat.

Slutsegment

När du har skapat en animeringsfunktion från segment kan du lägga till ett slutsegment så att animeringsfunktionen slutar vid en viss tidpunkt. Om du inte lägger till ett slutsegment körs det sista segmentet i animeringsfunktionen på obestämd tid.

Du lägger till ett slutsegment genom att anropa metoden IDCompositionAnimation::End och ange en förskjutning från början av animeringsfunktionen som anger funktionens slutpunkt. Förskjutningen måste vara större än början av föregående segment. Ett slutsegment kan inte heller användas som den första primitiva i en animeringsfunktion.

När du anropar Endanger du också ett slutligt värde för egenskapen som animerad. Egenskapen är inställd på det angivna slutliga värdet när slutpunkten för animeringsfunktionen nås.

När du har lagt till ett slutsegment kan du inte lägga till några andra segment i animeringsfunktionen. Det vill: alla metodanrop på animeringsobjektet misslyckas förutom IDCompositionAnimation::Återställ. Om du anropar Återställ returneras animeringsobjektet till ett rensat tillstånd där animeringsfunktionen inte innehåller några segment. Då kan du återigen lägga till segment.

Kompatibilitet med Windows Animation Manager

Windows Animation Manager (Windows Animation) matar ut animeringsprimitanter i ett format som är kompatibelt med DirectComposition-API:et. Det innebär att DirectComposition kan skapa animeringar baserat på animeringsprimitanter som skapats av Windows-animering.

Mer information finns i Windows Animation Manager, metoden IUIAnimationVariable2::GetCurve och Managing DirectComposition Animation with Windows Animation Manager v2.

DirectComposition Concepts