This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch label-enhancement
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git


The following commit(s) were added to refs/heads/label-enhancement by this push:
     new 8bf2072  enhance(pie): improve pie animation. #12553
8bf2072 is described below

commit 8bf2072baaa7c943210f5049333860caf435adf0
Author: pissang <[email protected]>
AuthorDate: Sun May 3 21:13:27 2020 +0800

    enhance(pie): improve pie animation. #12553
---
 src/chart/pie/PieSeries.ts |   6 ++-
 src/chart/pie/PieView.ts   | 124 +++++++++++++++------------------------------
 2 files changed, 47 insertions(+), 83 deletions(-)

diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts
index 4e0306c..8e86ed9 100644
--- a/src/chart/pie/PieSeries.ts
+++ b/src/chart/pie/PieSeries.ts
@@ -285,10 +285,14 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> 
{
         // Animation type. Valid values: expansion, scale
         animationType: 'expansion',
 
+        animationDuration: 1000,
+
         // Animation type when update. Valid values: transition, expansion
         animationTypeUpdate: 'transition',
 
-        animationEasing: 'cubicOut'
+        animationEasingUpdate: 'cubicInOut',
+        animationDurationUpdate: 500,
+        animationEasing: 'cubicInOut'
     };
 
 }
diff --git a/src/chart/pie/PieView.ts b/src/chart/pie/PieView.ts
index 8c88b70..4409db1 100644
--- a/src/chart/pie/PieView.ts
+++ b/src/chart/pie/PieView.ts
@@ -62,7 +62,7 @@ function updateDataSelected(
  */
 class PiePiece extends graphic.Sector {
 
-    constructor(data: List, idx: number) {
+    constructor(data: List, idx: number, startAngle: number) {
         super();
 
         this.z2 = 2;
@@ -74,10 +74,10 @@ class PiePiece extends graphic.Sector {
 
         this.setTextContent(text);
 
-        this.updateData(data, idx, true);
+        this.updateData(data, idx, startAngle, true);
     }
 
-    updateData(data: List, idx: number, firstCreate?: boolean): void {
+    updateData(data: List, idx: number, startAngle?: number, firstCreate?: 
boolean): void {
         const sector = this;
 
         const seriesModel = data.hostModel as PieSeriesModel;
@@ -104,26 +104,31 @@ class PiePiece extends graphic.Sector {
             }
             // Expansion
             else {
-                sector.shape.endAngle = layout.startAngle;
-                graphic.updateProps(sector, {
-                    shape: {
-                        endAngle: layout.endAngle
-                    }
-                }, seriesModel, idx);
+                if (startAngle != null) {
+                    sector.setShape({ startAngle, endAngle: startAngle });
+                    graphic.initProps(sector, {
+                        shape: {
+                            startAngle: layout.startAngle,
+                            endAngle: layout.endAngle
+                        }
+                    }, seriesModel, idx);
+                }
+                else {
+                    sector.shape.endAngle = layout.startAngle;
+                    graphic.updateProps(sector, {
+                        shape: {
+                            endAngle: layout.endAngle
+                        }
+                    }, seriesModel, idx);
+                }
             }
 
         }
         else {
-            if (animationTypeUpdate === 'expansion') {
-                // Sectors are set to be target shape and an overlaying 
clipPath is used for animation
-                sector.setShape(sectorShape);
-            }
-            else {
-                // Transition animation from the old shape
-                graphic.updateProps(sector, {
-                    shape: sectorShape
-                }, seriesModel, idx);
-            }
+            // Transition animation from the old shape
+            graphic.updateProps(sector, {
+                shape: sectorShape
+            }, seriesModel, idx);
         }
 
         sector.useStyle(data.getItemVisual(idx, 'style'));
@@ -311,22 +316,28 @@ class PieView extends ChartView {
         const group = this.group;
 
         const hasAnimation = ecModel.get('animation');
-        const isFirstRender = !oldData;
-        const animationType = seriesModel.get('animationType');
-        const animationTypeUpdate = seriesModel.get('animationTypeUpdate');
 
         const onSectorClick = zrUtil.curry(
             updateDataSelected, this.uid, seriesModel, hasAnimation, api
         );
 
         const selectedMode = seriesModel.get('selectedMode');
+
+        let startAngle: number;
+        // First render
+        if (!oldData) {
+            let shape = data.getItemLayout(0) as graphic.Sector['shape'];
+            for (let s = 1; isNaN(shape.startAngle) && s < data.count(); ++s) {
+                shape = data.getItemLayout(s);
+            }
+            if (shape) {
+                startAngle = shape.startAngle;
+            }
+        }
+
         data.diff(oldData)
             .add(function (idx) {
-                const piePiece = new PiePiece(data, idx);
-                // Default expansion animation
-                // if (isFirstRender && animationType !== 'scale') {
-                //     piePiece.stopAnimation(true);
-                // }
+                const piePiece = new PiePiece(data, idx, startAngle);
 
                 selectedMode && piePiece.on('click', onSectorClick);
 
@@ -339,11 +350,7 @@ class PieView extends ChartView {
 
                 graphic.clearStates(piePiece);
 
-                // if (!isFirstRender && animationTypeUpdate !== 'transition') 
{
-                //     piePiece.stopAnimation(true);
-                // }
-
-                piePiece.updateData(data, newIdx);
+                piePiece.updateData(data, newIdx, startAngle);
 
                 piePiece.off('click');
                 selectedMode && piePiece.on('click', onSectorClick);
@@ -356,61 +363,14 @@ class PieView extends ChartView {
             })
             .execute();
 
-        if (
-            hasAnimation && data.count() > 0
-            && (isFirstRender ? animationType !== 'scale' : 
animationTypeUpdate !== 'transition')
-        ) {
-            let shape = data.getItemLayout(0);
-            for (let s = 1; isNaN(shape.startAngle) && s < data.count(); ++s) {
-                shape = data.getItemLayout(s);
-            }
-
-            const r = Math.max(api.getWidth(), api.getHeight()) / 2;
-
-            const removeClipPath = zrUtil.bind(group.removeClipPath, group);
-            group.setClipPath(this._createClipPath(
-                shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, 
removeClipPath, seriesModel, isFirstRender
-            ));
-        }
-        else {
-            // clipPath is used in first-time animation, so remove it when 
otherwise. See: #8994
-            group.removeClipPath();
+        // Always use initial animation.
+        if (seriesModel.get('animationTypeUpdate') !== 'expansion') {
+            this._data = data;
         }
-
-        this._data = data;
     }
 
     dispose() {}
 
-    _createClipPath(
-        cx: number, cy: number, r: number,
-        startAngle: number, clockwise: boolean,
-        // @ts-ignore FIXME:TS make type in util.grpahic
-        cb,
-        seriesModel: PieSeriesModel, isFirstRender: boolean
-    ): graphic.Sector {
-        const clipPath = new graphic.Sector({
-            shape: {
-                cx: cx,
-                cy: cy,
-                r0: 0,
-                r: r,
-                startAngle: startAngle,
-                endAngle: startAngle,
-                clockwise: clockwise
-            }
-        });
-
-        const initOrUpdate = isFirstRender ? graphic.initProps : 
graphic.updateProps;
-        initOrUpdate(clipPath, {
-            shape: {
-                endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2
-            }
-        }, seriesModel, cb);
-
-        return clipPath;
-    }
-
     containPoint(point: number[], seriesModel: PieSeriesModel): boolean {
         const data = seriesModel.getData();
         const itemLayout = data.getItemLayout(0);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to