Animate Raphaël JS на основе значения обратного отсчета - аналогично полярным часам - PullRequest
1 голос
/ 07 ноября 2011

Во-первых, довольно плохо знаком с JS, но становлюсь лучше: -)

Этот вопрос похож на рисование центрированных дуг в Raphael JS , но немного отличается из-за некоторых особенностей.

Я использую jQuery Обратный отсчет для обработки обратного отсчета.

«Секунды» на таймере должны быть анимированы, как и Пример полярных часов на демонстрационной странице Raphaël.

Существует обратный вызов 'onTick', который, я думаю, должен быть каким-то образом 'подключен' к Raphaël.

Markup:

<div id="timer"></div>
<div id="pane"></div>

JS:

$(document).ready(function() {
$('#timer').countdown({ 
    until: new Date(2011, 11, 11), 
    timezone: -5,
    layout: '<ul>{d<}<li><em>{dn}</em> {dl}</li>{d>}{h<}<li><em>{hn}</em> {hl}</li>{h>}' + 
        '{m<}<li><em>{mn}</em> {ml}</li>{m>}{s<}<li><em>{sn}</em> {sl}</li>{s>}</ul>',
    onTick: get_seconds
});

var archtype = Raphael("pane", 200, 100)
archtype.customAttributes.arc = function (xloc, yloc, value, total, R) {
    var alpha = 360 / total * value,
        a = (90 - alpha) * Math.PI / 180,
        x = xloc + R * Math.cos(a),
        y = yloc - R * Math.sin(a),
        path;
    if (total == value) {
        path = [["M", xloc, yloc - R], ["A", R, R, 0, 1, 1, xloc - .01, yloc - R]];
    } else {
        path = [["M", xloc, yloc - R], ["A", R, R, 0, +(alpha > 180), 1, x, y]];
    }
    return {path: path};
};
//make an arc at 50,50 with a radius of 30 that grows from 0 to 40 of 100 with a bounce
var my_arc = archtype.path().attr({"stroke": "#f00", "stroke-width": 6, arc: [50, 50, 0, 100, 30]});
my_arc.animate({arc: [50, 50, timer_radius, 100, 30]}, 1500, "bounce");

function get_seconds () {
    var counter_seconds = $('#timer ul li:last em').text();
    timer_radius = 100 - (counter_seconds * 1.66666667);
}});        

Буду признателен за любую помощь. Спасибо!

1 Ответ

2 голосов
/ 18 ноября 2011

Здесь было окончательное использование (заставка будет активна до 11 декабря 2011 г.): http://tomwahlin.com/

И JavaScript, с которым я столкнулся:

;(function() {

// ON DOCUMENT.ready fire the primary function
$(function(){ timer.init() })    

var timer = {
  //
  // `create_arc` is used to assign an arc to the Raphael pane created in .init
  //
  create_arc: function(arch) {
    arch.customAttributes.arc = function (xloc, yloc, value, total, R) {
      var alpha = 360 / total * value,
      a = (90 - alpha) * Math.PI / 180,
      x = xloc + R * Math.cos(a),
      y = yloc - R * Math.sin(a),
      path;
      if (total == value) {
        path = [["M", xloc, yloc - R], ["A", R, R, 0, 1, 1, xloc - .01, yloc - R]];
      } else {
        path = [["M", xloc, yloc - R], ["A", R, R, 0, +(alpha > 180), 1, x, y]];
      }
      return {path: path};
    };
  },
  //
  // `get_arc_radius` returns the correct arc radius based on something
  //
  get_arc_radius: function() {
    return ((($('#timer ul li:last em').text()) * 1.66666667));
  },
  //
  // `update_based_on(type increment)
  //
  update_based_on: function(type, obj) {
    var types = {
      'seconds': 1000,
      'minutes': 60000,
      'hours': 3600000
    }

    var update = setInterval(function() {
      obj.animate({arc: [100, 100, timer.get_arc_radius(), 100, 90]}, types[type]);  
    }, types[type])
  },
  //
  // `create_pieces`
  //
  create_pieces: function() {
    var archtype = Raphael("pane", 200, 200)      
    timer.create_arc(archtype)

    //http://stackoverflow.com/questions/5061318/drawing-centered-arcs-in-raphael-js
    //make an arc at 50,50 with a radius of 30 that grows from 0 to 40 of 100 with a bounce
    var my_arc = archtype.path().attr({"stroke": "#5ab4fc", "stroke-width": 18, arc: [100, 100, timer.get_arc_radius(), 100, 90]});
    timer.update_based_on('seconds', my_arc)
  },
  //
  // `init` kicks of the main behavior
  //
  init: function() {

    $('#timer').countdown({ 
      until: new Date(2011, 11, 11), 
      timezone: -5,
      layout: '<ul>{d<}<li class="days"><em>{dn}</em> {dl}</li>{d>}{h<}<li class="hours"><em>{hn}</em> {hl}</li>{h>}' + 
        '{m<}<li class="minutes"><em>{mn}</em> {ml}</li>{m>}{s<}<li class="seconds"><em>{sn}</em> {sl}</li>{s>}</ul>',
      onTick: function() {}
    });

    timer.create_pieces()
  } // eo .init
}})();
...