- Вращение пятиугольника
- Увеличение размеров пятиугольника
- Увеличение размеров с одновременным вращением фигуры
- Скачать примеры анимации
В статье – Определение центра вращения фигур рассматривался вопрос, как математически определить центр вращения, имея в наличии готовый файл *.SVG.
Конечно, можно попытаться подобрать вручную координаты центра вращения фигуры, но это будет трудоёмко и неточно, а в результате при вращении фигуры будет “биение по центру”.
Для анимации вращения многоугольника будем использовать команду – “rotate” с атрибутами from=”0 38.6 63.46″ и to=”360 38.6 63.46″ – первая цифра начальный и конечный угол вращения соответственно в обоих атрибутах, вторая и третья цифры – координаты “x” и “y” цетра вращения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!-- the circle circumscribed around the polygon --> <circle cx="38.6" cy="63.46" r="32.16" stroke="crimson" stroke-width="1.5" fill="yellow"/> <!-- the rotation animation --> <g id="anim"> <animateTransform attributeName="transform" type="rotate" from="0 38.6 63.46" to="360 38.6 63.46" begin="click" dur="2s" end="mouseout+0.5s" repeatCount="indefinite" restart="whenNotActive" /> <!-- path pentagon --> <path d="M38.8 31.3 69.4 53.6 57.6 89.5 19.7 89.5 8.1 53.6z" fill="greenyellow" stroke="green" stroke-width="1.5" /> <!-- the center of rotation --> <g style="stroke:black"> <circle cx="38.6" cy="63.46" r="3" fill="none"/> <line x1="31.6" y1="63.46" x2="45.6" y2="63.46" /> <line x1="38.6" y1="56.46" x2="38.6" y2="70.46" /> </g> </g> |
begin=”click” – начало анимации после щелчка мышки по фигуре.
end=”mouseout+0.5s” – окончание анимации через полсекунды при уходе курсора с периметра фигуры.
repeatCount=”indefinite” – цикл анимации повторяется бесконечно, если не происходит других действий, например – движение курсора за пределы фигуры.
restart=”whenNotActive” – пока анимация не закончилась, невозможно запустить её вновь.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<g> <animateTransform attributeName="transform" type="scale" values="1; 2.3; 1" begin="click" dur="3s" repeatCount="2" restart="whenNotActive" /> <circle cx="38.6" cy="63.46" r="32.16" stroke="black" fill="#D0FF00"/> <g> <path d="M38.8 31.3 69.4 53.6 57.6 89.5 19.7 89.5 8.1 53.6z" fill="#0D87AB" stroke="black" stroke-width="1"/> <g style="stroke:#D0FF00"> <circle cx="38.6" cy="63.46" r="3" fill="none"/> <line x1="31.6" y1="63.46" x2="45.6" y2="63.46" /> <line x1="38.6" y1="56.46" x2="38.6" y2="70.46" /> </g> </g> <circle cx="38.6" cy="63.46" r="26" stroke="yellow" stroke-width="1" stroke-dasharray="3,2" style="fill:none;"/> </g> |
Увеличение размеров пятиугольника происходит после клика мышки.
type=”scale” – тип трансформации фигуры – увеличение.
values=”1; 2.3; 1″ – последовательно увеличивается с одинарного размера до двухкратного и затем уменьшение до прежнего размера.
repeatCount=”2″ – два цикла повторения анимации.
dur=”3s” – продолжительности анимации -3 секунды.
Более сложный пример анимации. Блок анимации вращения <g id=”an2″> … </g> вкладывается в блок анимации масштабирования <g id=”an1″> … </g> .
В роли блоков анимации выступают теги группы.
Структурная схема анимации
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="160" height="200" viewBox ="-10 -10 160 200"> <g id="an1"> <animateTransform attributeName="transform" type="scale" values="1;1.5; 2;1.5; 1" ..... /> <g id="an2"> <animateTransform attributeName="transform" type="rotate" from="0 32.9 33.19" to="360 32.9 33.19" ..... /> <path d="M48.5 60.9 16.9 60.8 1.2 33.4 17.1 6.1 48.7 6.2 64.4 33.6z" style="fill:crimson;stroke-width:2; stroke:black;"/> </g> <!-- end an2 --> </g> <!-- end an1 --> </svg> |
В блок вращения id=”an2″ входит path, отвечающий за отрисовку шестиугольника и сама команда анимации … type=”rotate”, которая вращает всё содержимое группы. Внешняя группа анимации – id=”an1″ осуществляет масштабирование …type=”scale” values=”1;1.5; 2;1.5; 1″ Сначало увеличение, затем возврат к прежним размерам.
Ниже полная версия кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<g id="an1"> <animateTransform attributeName="transform" type="scale" values="1;1.5; 2;1.5; 1" begin="an1.click" dur="6s" end="an1.mouseout+6s" repeatCount="indefinite" restart="whenNotActive" /> <circle cx="32.9" cy="33.19" r="32" stroke="dodgerblue" stroke-width="4" stroke-dasharray="12,4" fill="yellow"/> <g id="an2"> <animateTransform attributeName="transform" type="rotate" from="0 32.9 33.19" to="360 32.9 33.19" begin="an1.click" dur="1.5s" end="an1.mouseout+6s" repeatCount="indefinite" restart="whenNotActive" fill="freeze" /> <path d="M48.5 60.9 16.9 60.8 1.2 33.4 17.1 6.1 48.7 6.2 64.4 33.6z" style="fill:crimson;stroke-width:2; stroke:black;"/> <g style="stroke:yellow"> <circle cx="32.9" cy="33.19" r="3" fill="none"/> <line x1="25.9" y1="33.19" x2="39.9" y2="33.19" /> <line x1="32.9" y1="26.16" x2="32.9" y2="40.19" /> </g> </g> <!-- end an2 --> <circle cx="32.9" cy="33.19" r="27" stroke="yellow" stroke-dasharray="3,2" fill="none"/> </g> <!-- end an1 --> |
Начнем с блока вращения.
from=”0 32.9 33.19″ to=”360 32.9 33.19″ – полный круг от 0 до 360 градусов
begin=”an1.click” – начало анимации при клике по любому элементу внешней либо внутренней группы анимации.
Обратите внимание, что шестиугольник вращается и увеличивается, так как он входит во внутреннюю группу вращения, но окружности только увеличивается, так как они находятся вне группы вращения.
dur=”1.5s” – Время одного цикла вращения на один оборот, но вся анимации будет происходить дольше, так как повторение установлено на бесконечность, см. ниже
repeatCount=”indefinite” – анимация будет повторяться пока не вступят в силу другие условия
end=”an1.mouseout+6s” – окончание анимации через 6 сек. после ухода курсора с фигуры вращения. Попробуйте не уводить курсор мышки с шестиугольника, и вращение будет продолжаться бесконечно.
Блок масштабирования векторной фигуры.
type=”scale”
values=”1;1.5; 2;1.5; 1″ – увеличение, затем умеьшение размеров, согласно цепочке цифр
begin=”an1.click” – начало анимации при клике на элементе внешней группы.
Остальные параметры те же, как в группе id=”an2″
⇚ Определение центра вращения фигур
Анимация рисования линии ⇛