2016-05-30 2 views
-1

Я хочу создать анимацию, которая продлится несколько дней, чтобы отобразить траекторию полета apollo 8 на Луну в реальном времени.Начать время анимации SVG на определенную дату

Скажет, анимация начинается 10 июня и заканчивается 16 июня

Есть ли способ, я могу загрузить анимацию в середине, если а пользователи попадают на сайте 13 июня, чтобы показать прогресс космического корабля?

Вот мой SVG анимации до сих пор

<?xml version="1.0"?> 
 
<svg version="1.1" 
 
     id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docbase="/home/buck/Desktop/Wikipedia" sodipodi:version="0.32" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="Apollo 13 timeline.svg" inkscape:version="0.45.1" 
 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="4.5 180.6 315.2 51.1" 
 
     enable-background="new 4.5 180.6 315.2 51.1" xml:space="preserve"> 
 

 
    <!-- FLIGHT PATH --> 
 
    <path d="M4.9,208 
 
    c1.2,7.9,17.1,12,25.6,14.2c107.2,27.6,273-15.7,285.9-17.5c1.5-0.2,2.7,0.3,3,2c0.2,1.3-0.9,2.4-3,2.4 
 
    c-12.7-0.5-118.1-46.8-272.2-19.9c-11.3,2-26.1,4.4-33.2,8.4c-3.7,2.2-5,5.4-5,5.4s-1.4,2.2-1,5.4" 
 
      stroke="#CECECE" stroke-width="0.619" 
 
      fill="none" id="apollo11"/> 
 

 
    <!-- EARTH --> 
 
    <path id="path2764" sodipodi:ry="17.946428" sodipodi:type="arc" sodipodi:cy="337.375" sodipodi:cx="276.16071" sodipodi:rx="17.946428" d=" 
 
     M16.6,206.9c0,3.1-2.5,5.6-5.5,5.6c-3.1,0-5.6-2.5-5.6-5.5c0,0,0,0,0,0c0-3.1,2.5-5.6,5.5-5.6C14.1,201.3,16.6,203.8,16.6,206.9 
 
     C16.6,206.9,16.6,206.9,16.6,206.9z"/> 
 

 
    <!-- MOON --> 
 
    <path id="path2766" sodipodi:ry="4.987628" sodipodi:type="arc" sodipodi:cy="347.08206" sodipodi:cx="660.63977" sodipodi:rx="4.987628" fill="#646464" stroke="#646464" stroke-width="0.3095" d=" 
 
     M318.7,206.9c0,0.9-0.7,1.5-1.5,1.5c-0.9,0-1.5-0.7-1.5-1.5c0,0,0,0,0,0c0-0.9,0.7-1.5,1.5-1.5C318,205.3,318.7,206,318.7,206.9 
 
     C318.7,206.9,318.7,206.9,318.7,206.9z"/> 
 

 

 
    <!-- APOLLO 11 CSM & LEM --> 
 
    <circle cx="" cy="" r="1" fill="black"> 
 
     <!--Animation --> 
 
     <animateMotion dur="256s" repeatCount="indefinite"> 
 
       <mpath xlink:href="#apollo11"/> 
 
     </animateMotion> 
 
    </circle> 
 
</svg>

ответ

0

Вы должны использовать JavaScript, чтобы контролировать, как animateMotion должен вести себя.

Вот несколько советов. Предполагается, что посетитель заходит на вашу страницу в пределах диапазона воспроизведения анимации.

Во-первых, давайте определим некоторые переменные нам понадобятся:

var startDate = new Date('2016-06-10'), // when the animation starts 
    endDate = new Date('2016-06-16'), // when the animation stops 
    today = new Date() // visit date - should be between start and end dates 

Установка права dur Ation

Вместо жесткого кодирования значения dur, вы должны вычислить, сколько времени осталось между время посещения и дату окончания. анимация должна продолжать играть (в секундах)

var remainingDuration = (endDate - today)/1000 // in seconds 
// set this value in "dur" attribute 
// e.g. in jQuery: anim.attr('dur', remainingDuration + 's') 

Запуск анимации в нужный момент

Круг должен начинаться в положении, пропорциональном времени, прошедшего с момента начала мероприятия:

var animationDuration = endDate - startDate 
    , timeElapsed = today - startDate 
    , percentElapsed = timeElapsed/animationDuration 

Вы хотите анимацию, чтобы начать с позиции окружности на percentElapsed от animateMotion пути. Это можно управлять с помощью атрибутов keyTimes и keyPoints:

  • keyTimes должен содержать набор «точек» во время, между 0 и 1 (например, 0,5 находится на полпути через общую продолжительность анимации в)
  • keyPoints является используется для описания хода анимации animateMotion, соответствующей каждой точке в ketTime.

Reference для получения дополнительной информации.

  • keyTimes может быть жестко закодированы в "0;1"
  • keyPoints должен быть установлен в percentElapsed +";1"

P.S.Вы также должны указать calcMode="linear" (reference)

Вот пример анимации, начиная с 25%, используя логику выше (хотя установлено работать намного быстрее):

<?xml version="1.0"?> 
 
<svg version="1.1" 
 
     id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docbase="/home/buck/Desktop/Wikipedia" sodipodi:version="0.32" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="Apollo 13 timeline.svg" inkscape:version="0.45.1" 
 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="4.5 180.6 315.2 51.1" 
 
     enable-background="new 4.5 180.6 315.2 51.1" xml:space="preserve"> 
 

 
    <!-- FLIGHT PATH --> 
 
    <path d="M4.9,208 
 
    c1.2,7.9,17.1,12,25.6,14.2c107.2,27.6,273-15.7,285.9-17.5c1.5-0.2,2.7,0.3,3,2c0.2,1.3-0.9,2.4-3,2.4 
 
    c-12.7-0.5-118.1-46.8-272.2-19.9c-11.3,2-26.1,4.4-33.2,8.4c-3.7,2.2-5,5.4-5,5.4s-1.4,2.2-1,5.4" 
 
      stroke="#CECECE" stroke-width="0.619" 
 
      fill="none" id="apollo11"/> 
 

 
    <!-- EARTH --> 
 
    <path id="path2764" sodipodi:ry="17.946428" sodipodi:type="arc" sodipodi:cy="337.375" sodipodi:cx="276.16071" sodipodi:rx="17.946428" d=" 
 
     M16.6,206.9c0,3.1-2.5,5.6-5.5,5.6c-3.1,0-5.6-2.5-5.6-5.5c0,0,0,0,0,0c0-3.1,2.5-5.6,5.5-5.6C14.1,201.3,16.6,203.8,16.6,206.9 
 
     C16.6,206.9,16.6,206.9,16.6,206.9z"/> 
 

 
    <!-- MOON --> 
 
    <path id="path2766" sodipodi:ry="4.987628" sodipodi:type="arc" sodipodi:cy="347.08206" sodipodi:cx="660.63977" sodipodi:rx="4.987628" fill="#646464" stroke="#646464" stroke-width="0.3095" d=" 
 
     M318.7,206.9c0,0.9-0.7,1.5-1.5,1.5c-0.9,0-1.5-0.7-1.5-1.5c0,0,0,0,0,0c0-0.9,0.7-1.5,1.5-1.5C318,205.3,318.7,206,318.7,206.9 
 
     C318.7,206.9,318.7,206.9,318.7,206.9z"/> 
 

 

 
    <!-- APOLLO 11 CSM & LEM --> 
 
    <circle r="1" fill="black"> 
 
    <!--Animation --> 
 
    <animateMotion dur="7s" calcMode="linear" keyTimes= "0;1" keyPoints= ".25;1"> 
 
     <mpath xlink:href="#apollo11" /> 
 
    </animateMotion> 
 
    </circle> \ 
 
</svg>

Запуск анимации после keyPoints установлен

Вы можете добавить begin="indefinite" на animateMotion, затем запустить анимацию для запуска после keyPoints и dur были установлены в javascript, используя beginElement()reference. Мне не удалось заставить анимацию начать использовать это, я оставляю это вам как упражнение :)

Смежные вопросы