На этом примере анимации – движение гоночных машинок вдоль пути “path”, разбирается параметр “animateMotion”, который управляет направлением, началом, продолжительностью и окончанием движения.
Создание примера анимации состоит из нескольких этапов:
- Создание криволинейного пути
- Создание объектов движения
- Присоединение объектов движения к пути
- Создание элементов управления
- Оформление ландшафта
Путь можно создать вручную, но это довольно трудоёмкая операция, для упрощения воспользуемся любым векторным редактором, например – Inkscape. В редакторе рисуем путь с помощью инструмента – “Рисовать кривые Безье и прямые линии”. Путь должен быть замкнутым, если планируете неоднократное движение по контуру. Далее сохраняем файл в формате – *.svg .
Код получился очень избыточным. Для оптимизации кода загрузим файл в редактор SVG Editor. Далее необходимо нажать кнопку “Load”. В новом открывшемся окне нужно отметить все чекбоксы, как показано на рисунке ниже.
В разделах “Attributes” и “Styles” я выбрал значение “Decimal places” равное нулю, то есть в отредактированом файле будет ноль значащих цифр после запятой, а не “5” как в файле Inkscape. Далее на этой же вкладке нажимаем “Download”. Видим, что файл хорошо сократился в размере. Открываем этот файл любым текстовым редактором, находим строку path d=”M.. Присваиваем этому пути индификационный номер или уникальное имя – <path id=”t_path”. К этому “id=” будут привязаны движущиеся объекты.
Мы задумали, что по криволинейному пути будут двигаться машинки. Но в принципе это может быть любой объект: самолет в небе или баба-яга на метле, всё зависит от вашей фантазии. В случае летающих объектов траекторию пути в небе можно скрыть – style=”fill:none; stroke:none”/> . Для нашего примера находим машинку в векторных клип-артах.
Для уменьшения картинки в формате SVG есть несколько приёмов. На мой взгляд самый удобный способ – это непосредственное масштабирование внутри файла *.svg. Для этого откройте файл и, после объявления формата “SVG”, создайте новую группу <g>, которая охватит весь код файла до заключающего тега </g> <svg> , с присвоением группе уникального индификатора – <g id=”car-dodger” transform=”scale(0.15)”>. Масштаб уменьшения подберите, изменяя дробную часть команды scale(0.15). Пример кода смотри ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="580" height="200" viewBox="0 0 580 200" xmlns="//www.w3.org/2000/svg" version="1.1" > <g id="car-dodger" transform="scale(0.15)"> <rect x="70" y="10" width="220" height="130" fill="transparent" rx="150" stroke="dodgerblue" stroke-width="10" /> <rect x="10" y="70" width="340" height="80" fill="dodgerblue" rx="30" /> ... </g> </svg> |
Используем доработанный готовый файл для изображения машинки в другом файле с анимацией. Сделаем это с помощью парного тега <image>..</image> Внутри этих тегов командой xlink:href=”car-dodger.svg” открывается изображение машинки из другого файла см. код ниже начиная со строки 19.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<svg version = "1.1" baseProfile="full" xmlns = "//www.w3.org/2000/svg" xmlns:xlink = "//www.w3.org/1999/xlink" xmlns:ev = "//www.w3.org/2001/xml-events" width="580" height="400" viewBox="0 20 800 500" > <rect id="race_cars" x="0" y="0" width="100%" height="100%" fill="#EAB04B" stroke="none" /> <g > <path id="t_path" d="M370 150C530 230 529-106 730 50 790 90 770 260 700 180 526-55 580 340 430 260 225 138 39 286 270 400 440 450 540 350 670 260 780 190 820 420 670 420 540 420 412 497 320 480-105 414 113 16 370 150z" style="fill:none; stroke:#C1A161; stroke-width:24px"/> </g> <image x="0" y="-20" width="60px" height="40px" xlink:href="car-dodger.svg"> <animateMotion begin="race_cars.mouseover" dur="12s" repeatCount="3" rotate="auto" restart="whenNotActive" fill="freeze" > <mpath xlink:href="#t_path" /> </animateMotion> </image> </svg> |
Внутри парных тегов <animateMotion> … </animateMotion>, которые реализуют анимацию, с помощью команды <mpath xlink:href=”#t_path” /> происходит привязка объекта движения к криволинейному пути с иденфикатором “#t_path”.
begin=”race_cars.mouseover” – начало анимации при наведении курсора на объект с иденфикатором race_cars.
dur=”12s” repeatCount=”3″ – анимация продолжается 12сек., повторяется 3 раза.
rotate=”auto” – ориентация объекта движения относительно пути.
restart=”whenNotActive” – анимация не запустится повторно, пока она не закончится.
fill=”freeze” – по окончании движения объект останется на месте, “заморозится”.
Для начала анимации наведите курсор на картинку.
Создадим две кнопки: одна будет запускать анимацию “Start” при наведении курсора мышки, вторая “Stop” – останавливать, и добавим еще две машинки.
1 2 3 4 5 6 7 8 9 10 11 |
<g id="startButton"> <rect x="700" y="470" rx="3" ry="3" width="60" height="20" fill="green" /> <text x="730" y="485" font-size="16" font-weight="bold" font-family="Arial" text-anchor="middle" fill="white" >Start</text> </g> <g id="stopButton"> <rect x="600" y="470" rx="3" ry="3" width="60" height="20" fill="crimson" /> <text x="630" y="485" font-size="16" font-weight="bold" font-family="Arial" text-anchor="middle" fill="white" >Stop</text> </g> |
1 2 3 4 5 6 7 8 9 10 |
<image x="0" y="-20" width="60px" height="40px" xlink:href="car-red.svg"> <animateMotion begin="startButton.mouseover" end="stopButton.mouseover" dur="10s" repeatCount="2" rotate="auto" restart="whenNotActive" fill="freeze" > <mpath xlink:href="#t_path" /> </animateMotion> </image> |
Команда на запуск анимации – begin=”startButton.mouseover”
Команда остановки анимации – end=”stopButton.mouseover”
Для придания большей реалистичности движению машинок добавим к первому пути второй путь и разнесем машинки по этим путям. Снова открываем в Inkscape файл path.svg. Дублируем путь и сдвигаем копию вправо и вниз на несколько пикселей (18px). Присваиваем этому пути иденфикатор <path id=”t_path2″. Добавляем еще машинок, делим их по количеству на две части и прикрепляем их соответственно к разным путям.
1 2 3 4 5 6 7 8 9 10 |
<g > <path id="t_path" d="M370 150C530 230 529-106 730 50 790 90 770 260 700 180 526-55 580 340 430 260 225 138 39 286 270 400 440 450 540 350 670 260 780 190 820 420 670 420 540 420 412 497 320 480-105 414 113 16 370 150z" style="fill:none; stroke:#C1A161; stroke-width:24px"/> <path id="t_path2" d="M388 166C548 246 547.3-90.5 748 66 808 106 788 276 718 196 544-38.9 598 356 448 276 243.3 153.9 56.9 302.2 288 416 458 466 558 366 688 276 798 206 838 436 688 436 558 436 430.4 513.1 338 496-87.5 430.2 130.8 32.2 388 166z" style="color:#000000; fill:none;overflow:visible;stroke-opacity:1;stroke:#C1A161; stroke-width:19px;" /> </g> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<image x="0" y="-25" width="60px" height="40px" xlink:href="car-green1.svg"> <animateMotion begin="startButton.mouseover" end="stopButton.mouseover" dur="9s" repeatCount="2" rotate="auto" restart="whenNotActive" fill="freeze" > <mpath xlink:href="#t_path2" /> </animateMotion> </image> <image x="0" y="-25" width="60px" height="40px" xlink:href="car-white1.svg"> <animateMotion begin="startButton.mouseover" end="stopButton.mouseover" dur="8s" repeatCount="2" rotate="auto" restart="whenNotActive" fill="freeze" > <mpath xlink:href="#t_path" /> </animateMotion> </image> |
Опять обращаемся к векторным клипартам. Находим подходящие картинки домов, пальм, кустов. Оптимизируем в SVG Editor, масштабируем и помещаем эти “svg” файлы в ту же директорию, где находится наш файл. Открываем его и в секции <defs> размещаем ссылки на файлы, участвующие в оформлении. Присваиваем им иденфикационные номера: id=”palms”, id=”build”, id=”grass”. Изображения пальм и других оформительских элементов пока не видно, но далее мы будем ссылаться на них не один раз.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<defs> <g id="palms"> <image x="0" y="0" width="53px" height="133px" xlink:href="palm.svg"> </image> </g> <g id="build"> <image x="0" y="0" width="150px" height="150px" xlink:href="Building.svg"> </image> </g> <g id="grass"> <image x="0" y="0" width="256px" height="256px" xlink:href="grass.svg"> </image> </g> </defs> |
Размещаем оформительские элементы <use xlink:href=”” , указывая их координаты и масштабируя при необходимости.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!-- Palm trees --> <use xlink:href="#palms" x="200" y="200" /> <use xlink:href="#palms" x="220" y="210" /> <!-- Building --> <use xlink:href="#build" x="100" y="3" transform="scale(0.8)" /> <use xlink:href="#build" x="-10" y="5" /> <!-- grass --> <use xlink:href="#grass" x="20" y="980" transform="scale(0.4)"/> <use xlink:href="#grass" x="2220" y="930" transform="scale(0.2)"/> |