blob: f38f153b6f27f0096a7339453893cdad96aef9fc [file] [log] [blame]
<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="lib/simpleRequire.js"></script>
<script src="lib/config.js"></script>
<script src="lib/jquery.min.js"></script>
<script src="lib/facePrint.js"></script>
<script src="lib/testHelper.js"></script>
<script src="./custom-transition-texture.js"></script>
<link rel="stylesheet" href="lib/reset.css" />
</head>
<body>
<style>
</style>
<!-- <div id="texture-bar-texture-maker"></div> -->
<div id="spiral-fixed-extent"></div>
<div id="spiral-dynamic-extent"></div>
<div id="texture-bar-by-clipPath"></div>
<div id="no-animation"></div>
<div id="enter-animation-and-merge"></div>
<div id="enter-animation2"></div>
<div id="enter-animation-clipPath"></div>
<div id="style-animation"></div>
<div id="transform-animation"></div>
<div id="transform-animation-disabled"></div>
<div id="leave-animation"></div>
<!--
<script>
require(['echarts'], function (echarts) {
var chart = testHelper.create(echarts, 'texture-bar-texture-maker', {
title: [],
width: 200,
height: 200,
option: {},
buttons: [{
text: 'dataURL',
onclick: function () {
console.log(chart.getDataURL({
type: 'png',
backgroundColor: 'rgba(0,0,0,0)'
}));
}
}]
});
if (!chart) {
return;
}
var zr = chart.getZr();
var eles = [];
var extent = [0.0, 0.95];
var count = 200;
var unit = (extent[1] - extent[0]) / count;
var baseColor = 'rgb(0,0,255)';
for (var i = 0; i < count; i++) {
var oo = extent[0] + (count - i) * unit;
var color = echarts.color.modifyHSL(baseColor, null, null, oo);
var startAngle = 2 * Math.PI / count * i;
var endAngle = Math.min((2 * Math.PI / count * (i + 1) + 0.05), Math.PI * 2);
zr.add(new echarts.graphic.Sector({
type: 'sector',
shape: {
cx: 100,
cy: 100,
r: 100,
r0: 60,
startAngle: startAngle,
endAngle: endAngle
},
style: {
fill: color
}
}));
}
});
</script> -->
<script>
require([
'echarts'
], function (echarts) {
var _animationDuration = 5000;
var _animationDurationUpdate = 7000;
var _animationEasingUpdate = 'elasticOut';
var _angleLabel = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpius', 'Sagittarius', 'Capricornus', 'Aquarius', 'Pisces'];
var _valOnRoundAngle = _angleLabel.length;
var _valOnAngleStep = _valOnRoundAngle / 90;
var _barWidthValue = 0.4;
var _valOnRadiusStep = 4;
var _colors = [
{ border: 'green', inner: 'rgba(0,152,0,0.6)' },
{ border: 'red', inner: 'rgba(152,0,0,0.6)' },
{ border: 'blue', inner: 'rgba(0,0, 152,0.6)' },
];
var _currentDataIndex = 0;
var _datasourceList = [
[[3, 6, 9]],
[[12, 16, 14]],
[[17, 22, 19]],
];
var _barValOnRadiusList = [1, 2, 3];
function getMaxRadius() {
var radius = 0;
for (var k = 0; k < _barValOnRadiusList.length; k++) {
for (var i = 0; i < _datasourceList.length; i++) {
var row = _datasourceList[i][0];
for (var j = 0; j < row.length; j++) {
var valOnAngle = row[j];
radius = Math.max(
radius,
getSpiralValueOnRadius(_barValOnRadiusList[k], valOnAngle)
);
}
}
}
return Math.ceil(radius * 1.2);
}
function getSpiralValueOnRadius(valOnRadius, valOnAngle) {
return valOnRadius + _valOnRadiusStep * (valOnAngle / _valOnRoundAngle);
}
function renderItem(params, api) {
var children = [];
addShapes(api, children, _barValOnRadiusList[0], api.value(0), _colors[0]);
addShapes(api, children, _barValOnRadiusList[1], api.value(1), _colors[1]);
addShapes(api, children, _barValOnRadiusList[2], api.value(2), _colors[2]);
return {
type: 'group',
children: children
};
}
function addShapes(api, children, valOnRadius, valOnAngle, color) {
addPolygon(api, children, valOnRadius, valOnAngle, color);
addLabel(api, children, valOnRadius, valOnAngle, color);
}
function addPolygon(api, children, valOnRadius, valOnAngle, color) {
children.push({
type: 'polygon',
shape: {
points: makeShapePoints(api, valOnRadius, valOnAngle)
},
extra: {
valOnAngle: valOnAngle,
transition: 'valOnAngle'
},
style: {
lineWidth: 1,
fill: color.inner,
stroke: color.border
},
during: function (apiDuring) {
apiDuring.setShape('points', makeShapePoints(
api, valOnRadius, apiDuring.getExtra('valOnAngle')
));
}
});
}
function makeShapePoints(api, valOnRadius, valOnAngle) {
var points = [];
for (var iAngleVal = 0, end = valOnAngle + _valOnAngleStep; iAngleVal < end; iAngleVal += _valOnAngleStep) {
iAngleVal > valOnAngle && (iAngleVal = valOnAngle);
var iRadiusVal = getSpiralValueOnRadius(valOnRadius - _barWidthValue, iAngleVal);
var point = api.coord([iRadiusVal, iAngleVal]).slice(0, 2);
points.push(point);
}
for (var iAngleVal = valOnAngle; iAngleVal > -_valOnAngleStep; iAngleVal -= _valOnAngleStep) {
iAngleVal < 0 && (iAngleVal = 0);
var iRadiusVal = getSpiralValueOnRadius(valOnRadius + _barWidthValue, iAngleVal);
var point = api.coord([iRadiusVal, iAngleVal]).slice(0, 2);
points.push(point);
}
return points;
}
function addLabel(api, children, valOnRadius, valOnAngle, color) {
var point = makeLabelPosition(api, valOnRadius, valOnAngle);
children.push({
type: 'text',
x: point[0],
y: point[1],
transition: [],
extra: {
valOnAngle: valOnAngle,
transition: 'valOnAngle'
},
style: {
text: getText(valOnAngle),
fill: color.inner,
stroke: '#fff',
lineWidth: 3,
fontSize: 16,
align: 'center',
verticalAlign: 'middle'
},
z2: 50,
during: function (apiDuring) {
var iValOnAngle = apiDuring.getExtra('valOnAngle');
var point = makeLabelPosition(api, valOnRadius, iValOnAngle);
apiDuring.setTransform('x', point[0]).setTransform('y', point[1]);
apiDuring.setStyle('text', getText(iValOnAngle));
}
});
function getText(iValOnAngle) {
return (iValOnAngle / _valOnRoundAngle * 100).toFixed(0) + '%'
}
}
function makeLabelPosition(api, valOnRadius, valOnAngle) {
var iRadiusVal = getSpiralValueOnRadius(valOnRadius, valOnAngle);
return api.coord([iRadiusVal, valOnAngle + 1 / iRadiusVal / (2 * Math.PI) * _valOnRoundAngle]);
}
var option = {
// animation: false,
animationDuration: _animationDuration,
animationDurationUpdate: _animationDurationUpdate,
animationEasingUpdate: _animationEasingUpdate,
dataset: {
source: _datasourceList[_currentDataIndex]
},
angleAxis: {
type: 'value',
// splitLine: { show: false },
splitArea: {show: true},
axisLabel: {
formatter: function(val) {
return _angleLabel[val];
},
color: 'rgba(0,0,0,0.2)'
},
axisLine: { lineStyle: { color: 'rgba(0,0,0,0.2)' } },
min: 0,
max: _valOnRoundAngle
},
radiusAxis: {
type: 'value',
splitLine: { show: false },
axisLabel: { color: 'rgba(0,0,0,0.2)' },
axisLine: { lineStyle: { color: 'rgba(0,0,0,0.2)' } },
min: 0,
max: getMaxRadius()
},
polar: {},
series: [{
type: 'custom',
coordinateSystem: 'polar',
renderItem: renderItem
}]
};
var chart = testHelper.create(echarts, 'spiral-fixed-extent', {
title: [
'Spiral race with fixed radius extent.',
'Click **next**, polygon animation should be corrent.',
],
option: option,
buttons: [{
text: 'next',
onclick: function () {
_currentDataIndex++;
_currentDataIndex >= _datasourceList.length && (_currentDataIndex = 0);
chart.setOption({
dataset: {
source: _datasourceList[_currentDataIndex]
}
});
}
}, {
text: 'enable animation',
onclick: function () {
chart.setOption({ animation: true });
}
}, {
text: 'disable animation',
onclick: function () {
chart.setOption({ animation: false });
}
}]
});
});
</script>
<script>
require([
'echarts'
], function (echarts) {
var _animationDuration = 5000;
var _animationDurationUpdate = 7000;
// var _animationEasingUpdate = 'elasticOut';
var _animationEasingUpdate = 'quadraticOut';
var _radianLabels = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpius', 'Sagittarius', 'Capricornus', 'Aquarius', 'Pisces'];
var _valOnRoundRadian = _radianLabels.length;
var _radianStep = Math.PI / 45;
var _barWidthValue = 0.4;
var _valOnRadiusStep = 4;
// angleAxis.startAngle is 90 by default.
var _startRadian = Math.PI / 2;
var _colors = [
{ border: 'green', inner: 'rgba(0,152,0,0.6)' },
{ border: 'red', inner: 'rgba(152,0,0,0.6)' },
{ border: 'blue', inner: 'rgba(0,0, 152,0.6)' },
];
var _currentDataIndex = 0;
var _datasourceList = [
[ [1, 3], [2, 6], [3, 9] ], // datasource 0
[ [1, 12], [2, 16], [3, 14] ], // datasource 1
[ [1, 17], [2, 22], [3, 19] ], // datasource 2
[ [1, 19], [2, 33], [3, 24] ],
[ [1, 24], [2, 42], [3, 29] ],
[ [1, 27], [2, 47], [3, 41] ],
[ [1, 36], [2, 52], [3, 52] ],
[ [1, 46], [2, 59], [3, 63] ],
[ [1, 60], [2, 63], [3, 69] ],
];
var _barNamesByOrdinal = {1: 'A', 2: 'B', 3: 'C'};
function getMaxRadius() {
var radius = 0;
var datasource = _datasourceList[_currentDataIndex];
for (var j = 0; j < datasource.length; j++) {
var dataItem = datasource[j];
radius = Math.max(radius, getSpiralValueOnRadius(dataItem[0], dataItem[1]));
}
return Math.ceil(radius * 1.2);
}
function getSpiralValueOnRadius(valOnStartRadius, valOnEndAngle) {
return valOnStartRadius + _valOnRadiusStep * (valOnEndAngle / _valOnRoundRadian);
}
function getSpiralRadius(startRadius, endRadian, radiusStep) {
return startRadius + radiusStep * ((_startRadian - endRadian) / (Math.PI * 2));
}
function renderItem(params, api) {
var children = [];
var dataIdx = params.dataIndex;
addShapes(params, api, children, api.value(0), api.value(1), _colors[dataIdx]);
return {
type: 'group',
children: children
};
}
function addShapes(params, api, children, valOnStartRadius, valOnEndRadian, color) {
var coords = api.coord([valOnStartRadius, valOnEndRadian]);
var startRadius = coords[2];
var endRadian = coords[3];
var widthRadius = api.coord([_barWidthValue, 0])[2];
addPolygon(params, children, widthRadius, startRadius, endRadian, color);
addLabel(params, children, widthRadius, startRadius, endRadian, color);
}
function addPolygon(params, children, widthRadius, startRadius, endRadian, color) {
children.push({
type: 'polygon',
shape: {
points: makeShapePoints(params, widthRadius, startRadius, endRadian)
},
extra: {
widthRadius: widthRadius,
startRadius: startRadius,
endRadian: endRadian,
transition: ['widthRadius', 'startRadius', 'endRadian']
},
style: {
lineWidth: 1,
fill: color.inner,
stroke: color.border
},
during: function (apiDuring) {
apiDuring.setShape('points', makeShapePoints(
params,
apiDuring.getExtra('widthRadius'),
apiDuring.getExtra('startRadius'),
apiDuring.getExtra('endRadian')
));
}
});
}
function makeShapePoints(params, widthRadius, startRadius, endRadian) {
var points = [];
var radiusStep = getRadiusStepByWidth(widthRadius);
// angleAxis.clockwise is true by default. So when rotate clickwisely, radian decreases.
for (
var iRadian = _startRadian, end = endRadian - _radianStep;
iRadian > end;
iRadian -= _radianStep
) {
iRadian < endRadian && (iRadian = endRadian);
var iRadius = getSpiralRadius(startRadius - widthRadius, iRadian, radiusStep);
points.push(convertToPolarPoint(params, iRadius, iRadian));
}
for (
var iRadian = endRadian;
iRadian < _startRadian + _radianStep;
iRadian += _radianStep
) {
iRadian > _startRadian && (iRadian = _startRadian);
var iRadius = getSpiralRadius(startRadius + widthRadius, iRadian, radiusStep);
points.push(convertToPolarPoint(params, iRadius, iRadian));
}
return points;
}
function getRadiusStepByWidth(widthRadius) {
return widthRadius / _barWidthValue * _valOnRadiusStep;
}
function addLabel(params, children, widthRadius, startRadius, endRadian, color) {
var point = makeLabelPosition(params, widthRadius, startRadius, endRadian);
children.push({
type: 'text',
x: point[0],
y: point[1],
transition: [],
extra: {
startRadius: startRadius,
endRadian: endRadian,
widthRadius: widthRadius,
transition: ['startRadius', 'endRadian', 'widthRadius']
},
style: {
text: makeText(endRadian),
fill: color.inner,
stroke: '#fff',
lineWidth: 3,
fontSize: 12,
align: 'center',
verticalAlign: 'middle',
rich: {
round: { fontSize: 16 },
percent: { fontSize: 14 }
}
},
z2: 50,
during: function (apiDuring) {
var endRadian = apiDuring.getExtra('endRadian');
var point = makeLabelPosition(
params,
apiDuring.getExtra('widthRadius'),
apiDuring.getExtra('startRadius'),
endRadian
);
apiDuring.setTransform('x', point[0]).setTransform('y', point[1]);
apiDuring.setStyle('text', makeText(endRadian));
}
});
function makeText(endRadian) {
var radian = _startRadian - endRadian;
var PI2 = Math.PI * 2;
var round = Math.floor(radian / PI2);
var percent = (((radian / PI2) % 1) * 100).toFixed(1) + '%';
return 'Round {round|' + round + '}\n{percent|' + percent + '}';
}
}
function makeLabelPosition(params, widthRadius, startRadius, endRadian) {
var radiusStep = getRadiusStepByWidth(widthRadius);
var iRadius = getSpiralRadius(startRadius, endRadian, radiusStep);
return convertToPolarPoint(params, iRadius, endRadian - 10 / iRadius);
}
function convertToPolarPoint(renderItemParams, radius, radian) {
return [
Math.cos(radian) * radius + renderItemParams.coordSys.cx,
-Math.sin(radian) * radius + renderItemParams.coordSys.cy
];
}
var option = {
animationDuration: _animationDuration,
animationDurationUpdate: _animationDurationUpdate,
animationEasingUpdate: _animationEasingUpdate,
dataset: {
source: _datasourceList[_currentDataIndex]
},
tooltip: {},
angleAxis: {
type: 'value',
splitArea: { show: true },
axisLabel: {
formatter: function(val) {
return _radianLabels[val];
},
color: 'rgba(0,0,0,0.2)'
},
axisLine: { lineStyle: { color: 'rgba(0,0,0,0.2)' } },
min: 0,
max: _valOnRoundRadian
},
radiusAxis: {
type: 'value',
interval: 1,
splitLine: { show: false },
axisLabel: {
color: 'rgba(0,0,0,0.6)',
formatter: function (value) {
return _barNamesByOrdinal[value] || '';
}
},
axisTick: { show: false },
axisLine: { lineStyle: { color: 'rgba(0,0,0,0.2)' } },
min: 0,
max: getMaxRadius()
},
polar: {},
series: [{
type: 'custom',
coordinateSystem: 'polar',
renderItem: renderItem
}]
};
var chart = testHelper.create(echarts, 'spiral-dynamic-extent', {
title: [
'Spiral race with dynamic radius extent.',
'Click **next**. Polygon animation should be corrent.',
],
option: option,
buttons: [{
text: 'next',
onclick: function () {
_currentDataIndex++;
_currentDataIndex >= _datasourceList.length && (_currentDataIndex = 0);
chart.setOption({
dataset: {
source: _datasourceList[_currentDataIndex]
},
radiusAxis: {
max: getMaxRadius()
}
});
}
}, {
text: 'enable animation',
onclick: function () {
chart.setOption({ animation: true });
}
}, {
text: 'disable animation',
onclick: function () {
chart.setOption({ animation: false });
}
}]
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var _animationDuration = 1000;
var _animationDurationUpdate = 1000;
var _animationEasingUpdate = 'elasticOut';
var _datasourceList = [
[[1, 156]],
[[1, 54]],
[[1, 131]],
[[1, 32]],
[[1, 103]],
[[1, 66]],
];
var _valOnRadianMax = 200;
var _outerRadius = 100;
var _innerRadius = 85;
var _pointerInnerRadius = 40;
var _insidePanelRadius = 65;
var _currentDataIndex = 0;
function renderItem(params, api) {
var children = [];
var dataIdx = params.dataIndex;
var valOnRadian = api.value(1);
var coords = api.coord([api.value(0), valOnRadian]);
var polarEndRadian = coords[3];
var imageStyle = {
image: window.BAR_ROUND_GRADIENT_TEXTURE,
x: params.coordSys.cx - _outerRadius,
y: params.coordSys.cy - _outerRadius,
width: _outerRadius * 2,
height: _outerRadius * 2
};
return {
type: 'group',
children: [{
type: 'image',
style: imageStyle,
clipPath: {
type: 'sector',
shape: {
cx: params.coordSys.cx,
cy: params.coordSys.cy,
r: _outerRadius,
r0: _innerRadius,
startAngle: 0,
// polor: anticlockwise-positive radian
// sector: clockwise-positive radian
endAngle: -polarEndRadian,
transition: 'endAngle',
enterFrom: { endAngle: 0 }
}
}
}, {
type: 'image',
style: imageStyle,
clipPath: {
type: 'polygon',
shape: {
points: makePionterPoints(params, polarEndRadian),
},
extra: {
polarEndRadian: polarEndRadian,
transition: 'polarEndRadian',
enterFrom: { polarEndRadian: 0 }
},
during: function (apiDuring) {
apiDuring.setShape(
'points',
makePionterPoints(params, apiDuring.getExtra('polarEndRadian'))
);
}
},
}, {
type: 'circle',
shape: {
cx: params.coordSys.cx,
cy: params.coordSys.cy,
r: _insidePanelRadius
},
style: {
fill: '#fff',
shadowBlur: 25,
shadowOffsetX: 0,
shadowOffsetY: 0,
shadowColor: 'rgb(0,0,50)'
}
}, {
type: 'text',
extra: {
valOnRadian: valOnRadian,
transition: 'valOnRadian',
enterFrom: { valOnRadian: 0 }
},
style: {
text: makeText(valOnRadian),
fontSize: 40,
x: params.coordSys.cx,
y: params.coordSys.cy,
fill: 'rgb(0,50,190)',
align: 'center',
verticalAlign: 'middle',
enterFrom: { opacity: 0 }
},
during: function (apiDuring) {
apiDuring.setStyle('text', makeText(apiDuring.getExtra('valOnRadian')));
}
}]
};
}
function convertToPolarPoint(renderItemParams, radius, radian) {
return [
Math.cos(radian) * radius + renderItemParams.coordSys.cx,
-Math.sin(radian) * radius + renderItemParams.coordSys.cy
];
}
function makePionterPoints(renderItemParams, polarEndRadian) {
return [
convertToPolarPoint(renderItemParams, _outerRadius, polarEndRadian),
convertToPolarPoint(renderItemParams, _outerRadius, polarEndRadian + Math.PI * 0.03),
convertToPolarPoint(renderItemParams, _pointerInnerRadius, polarEndRadian)
];
}
function makeText(valOnRadian) {
// Validate additive animation calc.
if (valOnRadian < -10) {
alert('illegal during val: ' + valOnRadian);
}
return (valOnRadian / _valOnRadianMax * 100).toFixed(0) + '%'
}
var option = {
animationEasing: _animationEasingUpdate,
animationDuration: _animationDuration,
animationDurationUpdate: _animationDurationUpdate,
animationEasingUpdate: _animationEasingUpdate,
dataset: {
source: _datasourceList[_currentDataIndex]
},
tooltip: {},
angleAxis: {
type: 'value',
startAngle: 0,
axisLine: { show: false },
axisTick: { show: false },
axisLabel: { show: false },
splitLine: { show: false },
min: 0,
max: _valOnRadianMax
},
radiusAxis: {
type: 'value',
axisLine: { show: false },
axisTick: { show: false },
axisLabel: { show: false },
splitLine: { show: false }
},
polar: {},
series: [{
type: 'custom',
coordinateSystem: 'polar',
renderItem: renderItem
}]
};
var chart = testHelper.create(echarts, 'texture-bar-by-clipPath', {
title: [
'Angle gradient | clipPath animation',
'click **next** to check the transition animation in both bar and text.'
],
option: option,
height: 300,
buttons: [{
text: 'next',
onclick: function () {
_currentDataIndex++;
_currentDataIndex >= _datasourceList.length && (_currentDataIndex = 0);
chart.setOption({
dataset: {
source: _datasourceList[_currentDataIndex]
}
});
}
}]
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var option = {
animation: false,
xAxis: {
max: 600,
},
yAxis: {
},
dataZoom: [
{ type: 'slider', start: 10, end: 60 },
{ type: 'inside', start: 10, end: 60 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
children: [{
type: 'rect',
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
fill: 'blue',
}
}, {
type: 'circle',
shape: {
cx: -50,
cy: 50,
r: 30
},
style: {
fill: 'green',
},
textConfig: {
position: 'bottom'
},
textContent: {
style: {
text: 'xxxx',
fill: 'black',
}
}
}]
};
},
data: [[221, 333], [129, 312]]
}]
};
var chart = testHelper.create(echarts, 'no-animation', {
title: [
'No-animation',
'(1) Move dataZoom, position should have no transition animation but move normally.',
'(2) Use dataZoom hide a data item, and then show it.',
'(3) click button to setOption merge: ',
' circle **disappears** and rect become **red border black bg**',
'(4) **Repeat (2)** after merged, should be correct.'
],
height: 300,
option: option,
buttons: [{
text: 'go',
onclick: function () {
chart.dispatchAction({type: 'dataZoom', start: 10, end: 60});
}
}, {
text: 'click me to merge children',
onclick: function () {
chart.setOption({
series: {
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
children: [{
type: 'rect',
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
stroke: 'red',
lineWidth: 5
}
}]
};
}
}
});
}
}]
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var animationDuration = 5000;
var animationDurationUpdate = 4000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
xAxis: {
max: 600
},
yAxis: {
},
dataZoom: [
{ type: 'slider', start: 10, end: 60 },
{ type: 'inside', start: 10, end: 60 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
children: [{
type: 'rect',
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
fill: 'blue',
// enterFrom: { opacity: 0 }
}
}, {
type: 'circle',
shape: {
cx: -50,
cy: 50,
r: 30
},
style: {
fill: 'green',
// enterFrom: { opacity: 0 }
},
textConfig: {
position: 'bottom'
},
textContent: {
style: {
text: 'xxxx',
fill: 'black',
// enterFrom: { opacity: 0 }
}
}
}]
};
},
data: [[221, 333], [129, 312]]
}]
};
var chart = testHelper.create(echarts, 'enter-animation-and-merge', {
title: [
'Transition animation:',
'(1) Move dataZoom, position should have transition animation.',
'(2) Use dataZoom hide a data item, and then show it, ensure the **fade in** animation not be interupted.',
'(3) click button to setOption merge: ',
' circle **disappears** and rect become **red border black bg**',
'(4) **Repeat (2)** after merged, should be correct.'
],
height: 300,
option: option,
buttons: [{
text: 'click me to merge children',
onclick: function () {
chart.setOption({
series: {
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
children: [{
type: 'rect',
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
stroke: 'red',
lineWidth: 5
}
}]
};
}
}
});
}
}]
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var weatherIcons = {
'Sunny': './data/weather/sunny_128.png',
'Cloudy': './data/weather/cloudy_128.png',
'Showers': './data/weather/showers_128.png'
};
var animationDuration = 5000;
var animationDurationUpdate = 4000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
xAxis: {
max: 500
},
yAxis: {
},
dataZoom: [
{ type: 'slider', end: 60 },
{ type: 'inside', end: 60 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
enterFrom: {
y: 0
},
children: [{
type: 'image',
style: {
image: weatherIcons.Cloudy,
height: 50
}
}]
};
},
data: [[121, 133], [129, 312]]
}]
};
var chart = testHelper.create(echarts, 'enter-animation2', {
title: [
'(1) Move dataZoom, position should have transition animation.',
'(2) Use dataZoom hide a data item, and then show it, ensure the **drop** animation not be interupted.',
],
height: 300,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var animationDuration = 1000;
var animationDurationUpdate = 1000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
animationEasing: 'linear',
xAxis: {
max: 500
},
yAxis: {
max: 300
},
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
children: [{
type: 'rect',
shape: {x: 0, y: 0, width: 2000, height: 2000},
style: {fill: 'orange'}
}, {
type: 'polygon',
x: pos[0],
y: pos[1],
shape: {
points: [
[0, 0],
[50, -50],
[90, -50],
[140, 0],
[90, 50]
]
},
style: {
fill: 'green'
}
}],
clipPath: {
type: 'rect',
shape: {
x: params.coordSys.x,
y: params.coordSys.y,
width: params.coordSys.width,
height: params.coordSys.height,
enterFrom: {width: 0}
}
}
};
},
data: [[71, 133], [159, 113]]
}]
};
var chart = testHelper.create(echarts, 'enter-animation-clipPath', {
title: [
'Ensure enter animation by clipPath play normal (from left to right).'
],
height: 300,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var weatherIcons = {
'Sunny': './data/weather/sunny_128.png',
'Cloudy': './data/weather/cloudy_128.png',
'Showers': './data/weather/showers_128.png'
};
var animationDuration = 2000;
var animationDurationUpdate = 1000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
xAxis: {
max: 10000
},
yAxis: {
},
dataZoom: [
{ type: 'slider', start: 20, end: 50 },
{ type: 'inside', start: 20, end: 50 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
var width = Math.abs(pos[0] % 200 - 100) + 20;
return {
type: 'image',
x: pos[0],
y: pos[1],
style: {
image: weatherIcons.Showers,
width: width,
transition: 'width'
}
};
},
data: [[3321, 333], [4129, 312]]
}]
};
var chart = testHelper.create(echarts, 'style-animation', {
title: [
'Move dataZoom, make sure the "raining-cloud" size animation smooth.',
],
height: 300,
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var animationDuration = 4000;
var animationDurationUpdate = 1000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
xAxis: {
min: -200,
max: 400
},
yAxis: {
},
dataZoom: [
{ type: 'slider', start: 20, end: 70 },
{ type: 'inside', start: 20, end: 70 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
rotation: pos[0] / 500 * Math.PI,
transition: ['rotation'],
originX: -50,
originY: 50,
children: [{
type: 'rect',
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
fill: 'green',
enterFrom: { opacity: 0 }
}
}, {
type: 'circle',
shape: {
cx: -50,
cy: 50,
r: 30
},
style: {
fill: 'blue',
enterFrom: { opacity: 0 }
},
textConfig: {
position: 'bottom'
},
textContent: {
style: {
text: 'xxxx',
fill: 'black',
enterFrom: { opacity: 0 }
}
}
}]
};
},
data: [[121, 333], [29, 333]]
}]
};
var chart = testHelper.create(echarts, 'transform-animation', {
height: 300,
title: [
'Move dataZoom:',
'position should **no** transition animation.',
'rotatino should **has** transition animation.',
],
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var animationDuration = 4000;
var animationDurationUpdate = 1000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
xAxis: {
min: -200,
max: 400
},
yAxis: {
},
dataZoom: [
{ type: 'slider', start: 20, end: 70 },
{ type: 'inside', start: 20, end: 70 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'rect',
position: pos,
transition: [],
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
fill: 'green',
enterFrom: { opacity: 0 }
}
};
},
data: [[121, 333], [29, 333]]
}]
};
var chart = testHelper.create(echarts, 'transform-animation-disabled', {
height: 230,
title: [
'Move dataZoom:',
'transform animation should has been **disabled**.',
],
option: option
});
});
</script>
<script>
require(['echarts'], function (echarts) {
var animationDuration = 4000;
var animationDurationUpdate = 1000;
var option = {
animationDuration: animationDuration,
animationDurationUpdate: animationDurationUpdate,
xAxis: {
min: -200,
max: 400
},
yAxis: {
},
dataZoom: [
{ type: 'slider', start: 20, end: 70 },
{ type: 'inside', start: 20, end: 70 }
],
series: [{
type: 'custom',
renderItem: function (params, api) {
var pos = api.coord([api.value(0), api.value(1)]);
return {
type: 'group',
x: pos[0],
y: pos[1],
rotation: pos[0] / 500 * Math.PI,
transition: ['x', 'y', 'rotation'],
originX: -50,
originY: 50,
leaveTo: {scaleX: 0, scaleY: 0},
children: [{
type: 'rect',
shape: {
x: -50,
y: 50,
width: 100,
height: 50,
r: 10
},
style: {
fill: 'green',
enterFrom: { opacity: 0 }
}
}, {
type: 'circle',
shape: {
cx: -50,
cy: 50,
r: 30
},
style: {
fill: 'blue',
enterFrom: { opacity: 0 }
},
textConfig: {
position: 'bottom'
},
textContent: {
style: {
text: 'xxxx',
fill: 'black',
enterFrom: { opacity: 0 }
}
}
}]
};
},
data: [[121, 333], [29, 333]]
}]
};
var chart = testHelper.create(echarts, 'leave-animation', {
height: 300,
title: [
'Move dataZoom to "out" a item:',
'**Leave animation** on scale should be performed on rect and circle, but not on text.',
'The item should **finally be removed**.',
],
option: option
});
});
</script>
</body>
</html>