Strona główna » Poradniki » Grafika SVG » Wstęp do animacji
 

Wstęp do animacji

Wstęp

W grafice wektorowej SVG można animować utworzone grafiki w bardzo wygodny sposób. Animacja polega na utworzeniu klatek jak ma się zmieniać wybrany obiekt. Zaletą takiej animacji jest fakt, że do animowania można użyć nie tylko metod przygotowanych w specyfikacji SVG, ale również CSS. Niemniej niniejszy poradnik skupi się na tym pierwszym sposobie.

Obiekt animate

Obiekt animate można zadeklarować w dowolnym miejscu w pliku, ale zaleca się trzymanie wszystkich takich obiektów koło siebie w celu dobrej organizacji kodu. Obiekt ten może przyjmować różne atrybuty. W celu zrozumienia artykułu trzeba poznać część z nich:

AtrybutZastosowanie
ididentyfikator animacji
xlink:hrefidentyfikator obiektu, którego dotyczy animacja
attributeNameokreśla, który atrybut obiektu jest zmieniany
fromokreśla poczatkową wartość atrybutu
tookreśla końcową wartość atrybutu
durczas trwania animacji
beginokreśla kiedy ma się rozpocząć animacja
repeatCountokreśla ile razy animacja ma zostać odegrana

Piłka w ruchu

Jak już wspomniałem we wstępie animacja to zbiór stanów jak po kolei mają się zmieniać atrybuty obiektu. W celu ustalenia "klatki" służy obiekt animate. Przypuśćmy, że chcemy stworzyć animację, która będzie animowała ruch koła i będzie rozpoczynała się po kliknięciu w koło.

W przedstawionej animacji koło zmienia swoją pozycję wzdłuż współrzędnych X. Poniżej znajduje się kod pliku SVG z wyjaśnieniem:

  1. <svg
  2.   xmlns="http://www.w3.org/2000/svg"
  3.   xmlns:xlink="http://www.w3.org/1999/xlink"
  4.   width="400" height="100" viewBox="0 0 400 100">
  5.   <circle id="circle1" r="40" cx="50" cy="50" fill="blue" />
  6.   <animate id="circle_move"
  7.     xlink:href="#circle1"
  8.     attributeName="cx"
  9.     from="50"
  10.     to="350"
  11.     dur="1s"
  12.     begin="click"
  13.     fill="freeze" />
  14. </svg>

(1.) Otwórz obiekt SVG i (2. - 3.) określ dokumentacje z jakich korzysta plik oraz (4.) ustal wyświetlany i wybierany rozmiar rysunku. (4.) Utwórz koło, które nazywa się circle1 i znajduje się w lokalizacji (50, 50).

(5.) Utwórz klatkę animacji do której można się odwołać poprzez circle_move. (6.) Ustal, że animacja dotyczy utworzonego koła circle1. (7.) Zmieniającym się argumentem jest współrzędna X (cx) (8.) z (from) wartości 50 (9.) do (to) 350. (10.) Animacja ma trwać (dur) 1 sekundę. Zgodnie z założeniami (11.) rozpoczyna się zaraz po kliknięciu w obiekt. (12.) Ustalenie argumentu fill na freeze zapobiega powrotowi do stanu wyjściowego po zakończeniu animacji.

Jak widać animacja po zakończeniu zatrzymuje obiekt w nowe pozycji dzięki ustaleniu atrybutu fill. Warto jednak zauważyć, że po ponownym kliknięciu w koło obiekt rozpoczyna animację od pierwotnej pozycji. W celu uniknięcia tego problemu warto napisać dodatkową klatkę, która spowoduje, że koło wróci z powrotem.

W tył zwrot

Znając już kod, który przesuwa piłkę z lewej strony na prawą nie powinno stanowić problemu napisanie drugiej klatki, która spowoduje, że piłka wróci na swoją pierwotną pozycję tak jak zostało to przedstawione poniżej:

Trudnością może się tutaj okazać kwestia zsynchronizowania animacji. Co prawda wiadomo, że pierwsza animacja trwa sekundę, ale niewiadomo kiedy nastąpi kliknięcie. W tym celu należy atrybut begin animacji powrotnej ustawić na nazwę animacji i dopisać ".end". Wtedy animacja powrotna zostanie wywołana w momencie, gdy pierwsza zostanie zakończona. Tego typu rozwiązanie jest bardzo wygodne, ponieważ nawet po zmianie trwania pierwszej animacji, druga zostanie odegrana w odpowiednim momencie.

Kod nowego dokumentu SVG wygląda następująco:

  1. <svg
  2.   xmlns="http://www.w3.org/2000/svg"
  3.   xmlns:xlink="http://www.w3.org/1999/xlink"
  4.   width="400" height="100" viewBox="0 0 400 100">
  5.   <circle id="circle2" r="40" cx="50" cy="50" fill="green" />
  6.   <animate id="circle_forward"
  7.     xlink:href="#circle2"
  8.     attributeName="cx"
  9.     from="50"
  10.     to="350"
  11.     dur="1s"
  12.     begin="click"
  13.     fill="freeze" />
  14.   <animate id="circle_backward"
  15.     xlink:href="#circle2"
  16.     attributeName="cx"
  17.     from="350"
  18.     to="50"
  19.     dur="1s"
  20.     begin="circle_forward.end"
  21.     fill="freeze" />
  22. </svg>

Kolorowa piłka

Kolejne zadanie będzie polegać na utworzeniu animacji, która będzie zmieniać rozmiar koła w zakresie od 0 do R. W poniższym przykładzie R = 40. Po kliknięciu koło powinno zmniejszać się tak długo, aż R = 0 w 2 sekundy, a potem powinno wrócić do poprzedniego stanu po 3 sekundach. Poniżej znajduje się DEMO zadania:

Kod

W celu rozwiązania tego zadania należy zmienić attributeName na r, aby zmieniać promień koła. Później pozostaje ustalić odpowiedni wartości klatek na te z polecenia zadania.

  1. <svg
  2.   xmlns="http://www.w3.org/2000/svg"
  3.   xmlns:xlink="http://www.w3.org/1999/xlink"
  4.   width="200" height="200" viewBox="0 0 100 100">
  5.   <circle id="circle3" r="40" cx="50" cy="50" fill="purple" />
  6.   <animate id="circle_open"
  7.     xlink:href="#circle3" attributeName="r"
  8.     from="40" to="0"
  9.     dur="2s"
  10.     begin="click"
  11.     fill="freeze" />
  12.   <animate id="circle_open_back"
  13.     xlink:href="#circle3" attributeName="r"
  14.     from="0" to="40"
  15.     dur="3s"
  16.     begin="circle_open.end"
  17.     fill="freeze" />
  18. </svg>

Podsumowanie

Po przeczytaniu tego artykułu nie powinno stanowić problemu utworzenie klatek animacji i synchronizowania ich. W dalszych częściach zostanie konkretniej wyjaśnione jak sterować ilością powtórzeń oraz zasad zmian wartości atrybutu.

Zadania

Zadanie 1

Napisz animację, która będzie animować czerwony kwadrat. Na płótnie powinien znajdować się tylko jeden obiekt, który będzie kwadratem. Po kliknięciu powinien się poszerzyć się dwa razy, następnie wydłużyć dwukrotnie i na zakończenie zmienić kolor na zielony. Długość każdej zmiany rozmiaru powinna wynosić dokładnie 3 sekundy każda, a zmiana koloru sekundę.

Drugą część animacji polega na równoczesnej zmianie szerokości i wysokości o połowę w ciągu 2 sekund. Następnie w sekundę kwadrat powinien zrobić się czerwony.

Zadanie 2

Wykonaj ponownie Zadanie 1, ale w trakcie zmian rozmiaru środek obiektu powinien znajdować się cały czas pośrodku płótna.