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