light-chart
Version:
Charts for mobile visualization.
116 lines (107 loc) • 2.89 kB
JavaScript
/**
* Group animation
* @author sima.zhang1990@gmail.com
*/
const Util = require('../util/common');
const Shape = require('../graphic/shape');
const Timeline = require('../graphic/animate/timeline');
const Animator = require('../graphic/animate/animator');
let timeline;
Shape.prototype.animate = function() {
const attrs = Util.mix({}, this.get('attrs'));
return new Animator(this, attrs, timeline);
};
const Animate = require('./animate');
const Action = require('./group-action');
Animate.Action = Action;
Animate.defaultCfg = {
line(coord) {
if (coord.isPolar) {
return Action.groupScaleInXY;
}
return Action.groupWaveIn;
},
area(coord) {
if (coord.isPolar) {
return Action.groupScaleInXY;
}
return Action.groupWaveIn;
},
path(coord) {
if (coord.isPolar) {
return Action.groupScaleInXY;
}
return Action.groupWaveIn;
},
point() {
return Action.shapesScaleInXY;
},
interval(coord) {
let result;
if (coord.isPolar) {
result = Action.groupScaleInXY;
if (coord.transposed) {
result = Action.groupWaveIn;
}
} else {
result = coord.transposed ? Action.groupScaleInX : Action.groupScaleInY;
}
return result;
},
schema() {
return Action.groupWaveIn;
}
};
function getAnimate(geomType, coord, animationName) {
let result;
if (animationName) {
result = Animate.Action[animationName];
} else {
result = Animate.getAnimation(geomType, coord, 'appear');
}
return result;
}
function getAnimateCfg(geomType, animateCfg) {
const defaultCfg = Animate.getAnimateCfg(geomType, 'appear');
if (animateCfg && animateCfg.appear) {
return Util.deepMix({}, defaultCfg, animateCfg.appear);
}
return defaultCfg;
}
module.exports = {
afterCanvasInit(/* chart */) {
timeline = new Timeline();
timeline.play();
},
beforeCanvasDraw(chart) {
if (chart.get('animate') === false) {
return;
}
const geoms = chart.get('geoms');
const coord = chart.get('coord');
let animateCfg;
let animate;
Util.each(geoms, geom => {
const type = geom.get('type');
const container = geom.get('container');
if (geom.get('animateCfg') !== false) {
animateCfg = getAnimateCfg(type, geom.get('animateCfg'));
animate = getAnimate(type, coord, animateCfg.animation);
if (Util.isFunction(animate)) {
animate(container, animateCfg);
} else if (Animate.defaultCfg[type]) {
animate = Animate.defaultCfg[type](coord);
const yScale = geom.getYScale();
const zeroY = coord.convertPoint({
x: 0,
y: yScale.scale(geom.getYMinValue())
});
animate && animate(container, animateCfg, coord, zeroY);
}
}
});
},
afterCanvasDestroyed(/* chart */) {
timeline.stop();
}
};