|  | <!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> |