אנימציה

בדף הזה נסביר איך מוסיפים אנימציה של שינויים שבוצעו בתרשים, במקום להחיל אותם באופן מיידי.

תוכן עניינים

סקירה כללית

אפשר להציג תרשימים של Google בצורה חלקה באחת משתי דרכים: בזמן ההפעלה כשמשרטטים את התרשים בפעם הראשונה, או כשמנסים מחדש תרשים אחרי שמבצעים שינוי בנתונים או באפשרויות.

כדי להוסיף אנימציה בזמן ההפעלה:

  1. מגדירים את הנתונים והאפשרויות בתרשים. חשוב להגדיר את משך האנימציה ואת סוג ההתאמה.
  2. יש להגדיר את הערך animation: {"startup": true} — הגדרה זו באפשרויות תגרום לכך שהתרשים יתחיל עם ערכי סדרה שמופיעים בערך הבסיס, ותופיע אנימציה לפי המצב הסופי שלהם.
  3. קוראים אל chart.draw() ומעבירים את הנתונים והאפשרויות שלכם.

כדי להוסיף אנימציה למעבר:

  1. מתחילים בתרשים שכבר עובד.
  2. משנים את טבלת הנתונים או את האפשרויות הקיימות. סוגי תרשימים שונים תומכים בשינויים שונים. כדי לדעת אילו שינויים נתמכים בסוגי התרשימים, אפשר לעיין במאמר שינויים נתמכים.
  3. לציין את התנהגות המעבר באמצעות האפשרות animation.
  4. צריך להפעיל את הערך chart.draw() בתרשים כדי לעבור לערכים החדשים.

הנה דוגמה פשוטה שמשנה את הערך היחיד שמוצג בתרשים עמודות בכל לחיצה על לחצן:

   function init() {
    var options = {
      width: 400,
      height: 240,
      animation:{
        duration: 1000,
        easing: 'out',
      },
      vAxis: {minValue:0, maxValue:1000}
    };
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'N');
    data.addColumn('number', 'Value');
    data.addRow(['V', 200]);

    var chart = new google.visualization.ColumnChart(
        document.getElementById('visualization'));
    var button = document.getElementById('b1');

    function drawChart() {
      // Disabling the button while the chart is drawing.
      button.disabled = true;
      google.visualization.events.addListener(chart, 'ready',
          function() {
            button.disabled = false;
          });
      chart.draw(data, options);
    }

    button.onclick = function() {
      var newValue = 1000 - data.getValue(0, 1);
      data.setValue(0, 1, newValue);
      drawChart();
    }
    drawChart();
  }

שינויים נתמכים

התמיכה בסוגים שונים של מעברים משתנה מתרשים אחד לאחר. אלה סוגי המעברים:

  • שינויים רק בערכים של טבלת הנתונים. מספר השורות והעמודות זהה, והעמודות והסוגים המקוריים שלהן נשארים ללא שינוי.
  • הוספה או הסרה של עמודות (סדרה).
  • הוספה או הסרה של שורות (קטגוריות).
  • שינויים באפשרויות התרשים. בשלב הזה, האפשרויות שיוצגו לאנימציה לאחר שינוי כוללות:
    • חלון התצוגה (vAxis.viewWindow.min, vAxis.viewWindow.max, hAxis.viewWindow.min, hAxis.viewWindow.max) – אפשר לשנות את חלון התצוגה כדי להשיג אפקטים של 'מרחק מתצוגה' ואפקטים רציפים של 'דריפט' (ראו דוגמאות בהמשך)
    • ערכים של vAxis.ticks ו-hAxis.ticks
    • vAxis.gridlines.count וגם hAxis.gridlines.count
    • vAxis.direction וגם hAxis.direction
    • vAxis.baseline וגם hAxis.baseline
    • vAxis.logScale וגם hAxis.logScale
    • גודל התרשים (height ו-width)
    • שטח התרשים (chartArea.height, chartArea.width, chartArea.top, chartArea.left)
סוג השינוי סוגי תרשימים חוקיים
שינויים בערכים תרשים פיזור, תרשים קו, תרשים שטח, תרשים עמודות, תרשים בועות, תרשים עמודות אנכי, CandlestickChart, SteppedAreaChart, תרשים משולב, מד
הוספה/הסרה של שורות תרשים פיזור, LineChart, תרשים שטח, תרשים בועות, תרשים משולב (עם סדרה של קו/אזור בלבד)
הוספה/הסרה של עמודות תרשים פיזור, תרשים קו, תרשים שטח, תרשים עמודות, תרשים בועות, תרשים עמודות אנכי, CandlestickChart, SteppedAreaChart, תרשים משולב
שינוי אפשרויות תרשים תרשים פיזור, תרשים קו, תרשים שטח, תרשים עמודות, תרשים בועות, תרשים עמודות אנכי, CandlestickChart, SteppedAreaChart, תרשים משולב

התנהגות ההעברה

שם
animation.duration

משך האנימציה, באלפיות השנייה. למידע נוסף, אפשר לעיין במשאבי העזרה בנושא אנימציה.

סוג: מספר
ברירת מחדל: 0
animation.easing

פונקציית ההתאמה לצפייה שמוחלת על האנימציה. אלו האפשרויות הזמינות:

  • 'לינארי' - מהירות קבועה.
  • 'in' – התאמה קלה – הפעלה איטית והגברת מהירות.
  • 'out' – עשיית סדר – מתחילים מהר ומאטים.
  • 'inAndOut' – להיכנס ולצאת בקלות – מתחילים לאט, מגבירים ואז מאטים.
סוג: מחרוזת
ברירת מחדל: 'לינארי'
animation.startup

המדיניות קובעת אם התרשים יכלול אנימציה בשרטוט הראשוני. אם הערך שלו הוא true, התרשים יתחיל במצב הבסיסי שיונפש למצב הסופי שלו.

סוג: בוליאני
ברירת מחדל – False

אירועים

כשמשרטטים תרשים, האירוע 'מוכן' מופעל כשהתרשים מוכן לקריאות שיטה חיצונית. התרשים יפעיל את האירוע animationfinish כשהמעבר יושלם.

שם
animationfinish

מופעל כשאנימציית המעבר מסתיימת.

מאפיינים:ללא

דוגמאות

שינויים בערכים

   // Some raw data (not necessarily accurate)
    var rowData1 = [['Month', 'Bolivia', 'Ecuador', 'Madagascar', 'Papua  Guinea',
                     'Rwanda', 'Average'],
                    ['2004/05', 165, 938, 522, 998, 450, 114.6],
                    ['2005/06', 135, 1120, 599, 1268, 288, 382],
                    ['2006/07', 157, 1167, 587, 807, 397, 623],
                    ['2007/08', 139, 1110, 615, 968, 215, 409.4],
                    ['2008/09', 136, 691, 629, 1026, 366, 569.6]];
    var rowData2 = [['Month', 'Bolivia', 'Ecuador', 'Madagascar', 'Papua  Guinea',
                     'Rwanda', 'Average'],
                    ['2004/05', 122, 638, 722, 998, 450, 614.6],
                    ['2005/06', 100, 1120, 899, 1268, 288, 682],
                    ['2006/07', 183, 167, 487, 207, 397, 623],
                    ['2007/08', 200, 510, 315, 1068, 215, 609.4],
                    ['2008/09', 123, 491, 829, 826, 366, 569.6]];

    // Create and populate the data tables.
    var data = [];
    data[0] = google.visualization.arrayToDataTable(rowData1);
    data[1] = google.visualization.arrayToDataTable(rowData2);

    var options = {
      width: 400,
      height: 240,
      vAxis: {title: "Cups"},
      hAxis: {title: "Month"},
      seriesType: "bars",
      series: {5: {type: "line"}},
      animation:{
        duration: 1000,
        easing: 'out'
      },
    };
    var current = 0;
    // Create and draw the visualization.
    var chart = new google.visualization.ComboChart(document.getElementById('visualization'));
    var button = document.getElementById('b1');
    function drawChart() {
      // Disabling the button while the chart is drawing.
      button.disabled = true;
      google.visualization.events.addListener(chart, 'ready',
          function() {
            button.disabled = false;
            button.value = 'Switch to ' + (current ? 'Tea' : 'Coffee');
          });
      options['title'] = 'Monthly ' + (current ? 'Coffee' : 'Tea') + ' Production by Country';

      chart.draw(data[current], options);
    }
    drawChart();

    button.onclick = function() {
      current = 1 - current;
      drawChart();
    }

הוספה והסרה של שורות

    var options = {
      width: 400,
      height: 240,
      vAxis: {minValue:0, maxValue:100},
      animation: {
        duration: 1000,
        easing: 'in'
      }
    };

    var chart = new google.visualization.LineChart(
        document.getElementById('visualization'));
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'x');
    data.addColumn('number', 'y');
    data.addRow(['100', 123]);
    data.addRow(['700', 17]);
    var button = document.getElementById('b1');
    function drawChart() {
      // Disabling the button while the chart is drawing.
      button.disabled = true;
      google.visualization.events.addListener(chart, 'ready',
          function() {
            button.disabled = false;
          });
      chart.draw(data, options);
    }

    button.onclick = function() {
      if (data.getNumberOfRows() > 5) {
        data.removeRow(Math.floor(Math.random() * data.getNumberOfRows()));
      }
      // Generating a random x, y pair and inserting it so rows are sorted.
      var x = Math.floor(Math.random() * 1000);
      var y = Math.floor(Math.random() * 100);
      var where = 0;
      while (where < data.getNumberOfRows() && parseInt(data.getValue(where, 0)) < x) {
        where++;
      }
      data.insertRows(where, [[x.toString(), y]]);
      drawChart();
    }
    drawChart();

הוספה והסרה של עמודות

    var options = {
      width: 400,
      height: 240,
      vAxis: {minValue:0, maxValue:1000},
      animation: {
        duration: 1000,
        easing: 'out'
      }
    };

    var chart = new google.visualization.ColumnChart(
        document.getElementById('visualization'));
    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz';
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'x');
    data.addColumn('number', 'A');
    data.addColumn('number', 'B');
    data.addRow(['A', 123, 40]);
    data.addRow(['B', 17, 20]);
    var addButton = document.getElementById('b1');
    var removeButton = document.getElementById('b2');
    function drawChart() {
      // Disabling the buttons while the chart is drawing.
      addButton.disabled = true;
      removeButton.disabled = true;
      google.visualization.events.addListener(chart, 'ready',
          function() {
            // Enabling only relevant buttons.
            addButton.disabled = (data.getNumberOfColumns() - 1) >= chars.length;
            removeButton.disabled = (data.getNumberOfColumns() - 1) < 2;
          });
      chart.draw(data, options);
    }
    function shuffleAndDrawChart() {
      for (var i = 0; i < data.getNumberOfRows(); ++i) {
        for (var j = 1; j < data.getNumberOfColumns(); ++j) {
          var num = Math.floor(Math.random() * 1000);
          data.setValue(i, j, num);
        }
      }
      drawChart();
    }
    addButton.onclick = function() {
      data.addColumn('number', chars[data.getNumberOfColumns() - 1]);
      shuffleAndDrawChart();
    }
    removeButton.onclick = function() {
      data.removeColumn(data.getNumberOfColumns() - 1);
      shuffleAndDrawChart();
    }
    drawChart();

שינוי חלון התצוגה

    var options = {
      width: 400,
      height: 240,
      animation: {
        duration: 1000,
        easing: 'in'
      },
      hAxis: {viewWindow: {min:0, max:5}}
    };

    var chart = new google.visualization.SteppedAreaChart(
        document.getElementById('visualization'));
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'x');
    data.addColumn('number', 'y');
    var MAX = 10;
    for (var i = 0; i < MAX; ++i) {
      data.addRow([i.toString(), Math.floor(Math.random() * 100)]);
    }
    var prevButton = document.getElementById('b1');
    var nextButton = document.getElementById('b2');
    var changeZoomButton = document.getElementById('b3');
    function drawChart() {
      // Disabling the button while the chart is drawing.
      prevButton.disabled = true;
      nextButton.disabled = true;
      changeZoomButton.disabled = true;
      google.visualization.events.addListener(chart, 'ready',
          function() {
            prevButton.disabled = options.hAxis.viewWindow.min <= 0;
            nextButton.disabled = options.hAxis.viewWindow.max >= MAX;
            changeZoomButton.disabled = false;
          });
      chart.draw(data, options);
    }

    prevButton.onclick = function() {
      options.hAxis.viewWindow.min -= 1;
      options.hAxis.viewWindow.max -= 1;
      drawChart();
    }
    nextButton.onclick = function() {
      options.hAxis.viewWindow.min += 1;
      options.hAxis.viewWindow.max += 1;
      drawChart();
    }
    var zoomed = false;
    changeZoomButton.onclick = function() {
      if (zoomed) {
        options.hAxis.viewWindow.min = 0;
        options.hAxis.viewWindow.max = 5;
      } else {
        options.hAxis.viewWindow.min = 0;
        options.hAxis.viewWindow.max = MAX;
      }
      zoomed = !zoomed;
      drawChart();
    }
    drawChart();

שינוי הגודל של התרשים

      google.charts.load('current', {'packages':['corechart']});
    google.charts.setOnLoadCallback(drawChart);

    function drawChart () {

      function genData () {
        var array = [];

        for (var i = 0; i < 10; i++) {
          var x = i,
              y = Math.floor(Math.random() * 50),
              z = Math.floor(Math.random() * 25);
          array.push([x, y, z]);
        }
        return array;
      }

      function doubleIt() {
        options.chartArea.height = '100%';
        options.chartArea.width = '100%';
      }

      function halveIt() {
        options.chartArea.height = '50%';
        options.chartArea.width = '50%';
      }

      function goTo50() {
        options.chartArea.left = '50%';
        options.chartArea.top = '50%';
      }

      function goTo10() {
        options.chartArea.left = '10%';
        options.chartArea.top = '10%';
      }

      var data = new google.visualization.DataTable();
      data.addColumn('number', 'X');
      data.addColumn('number', 'Y');
      data.addColumn('number', 'Z');

      data.addRows(genData());

      var options = {
        height: 500,
        chartArea: {
          height: '50%',
          width: '50%',
          top: '10%',
          left: '10%'
        },
        colors: ['#ee8100', '#9575cd'],
        animation: {
          duration: 1500,
          easing: 'linear',
          startup: true
        },
        vAxis: {
          ticks: [10, 20, 30, 40, 50, 60],
          gridlines: {color: '#ccc'}
        },
        hAxis: {
          ticks: [0, 4, 8, 12],
          gridlines: {color: '#ccc'}
        },
        legend: {position: 'none'},
        enableInteractivity: false
      };

      var chart = new google.visualization.LineChart(document.getElementById('chart_div'));


      chart.draw(data, options);

      var btns = document.querySelector('#btns');
      btns.onclick = function (e) {
        switch(e.target.id) {
            case "size":
              options.chartArea.height === '50%' ? doubleIt() : halveIt();
              break;
            case "slide":
              options.chartArea.left === '10%' ? goTo50() : goTo10();
        }

        chart.draw(data, options);
      }

    }