PieView.js 8.1 KB
Newer Older
L
lang 已提交
1 2
define(function (require) {

L
Add pie  
lang 已提交
3 4
    var graphic = require('../../util/graphic');
    var zrUtil = require('zrender/core/util');
L
lang 已提交
5

L
lang 已提交
6 7 8 9
    function selectData(seriesModel) {
        var data = seriesModel.getData();
        var dataIndex = this.dataIndex;
        var name = data.getName(dataIndex);
L
lang 已提交
10
        var selectedOffset = seriesModel.get('selectedOffset');
L
lang 已提交
11

L
lang 已提交
12 13 14 15 16 17 18 19 20 21
        seriesModel.toggleSelected(name);

        data.each(function (idx) {
            updateSelected(
                data.getItemGraphicEl(idx),
                data.getItemLayout(idx),
                seriesModel.isSelected(data.getName(idx)),
                selectedOffset
            );
        });
L
lang 已提交
22 23
    }

L
lang 已提交
24
    function updateSelected(el, layout, isSelected, selectedOffset) {
L
lang 已提交
25
        var shape = el.shape;
L
lang 已提交
26
        var midAngle = (layout.startAngle + layout.endAngle) / 2;
L
lang 已提交
27 28 29 30

        var dx = Math.cos(midAngle);
        var dy = (shape.clockwise ? 1 : -1) * Math.sin(midAngle);

L
lang 已提交
31
        var offset = isSelected ? selectedOffset : 0;
L
lang 已提交
32 33 34 35 36 37 38 39 40

        // animateTo will stop revious animation like update transition
        el.animate()
            .when(200, {
                position: [dx * offset, dy * offset]
            })
            .start('bounceOut');
    }

L
lang 已提交
41 42 43 44 45 46 47 48 49 50 51 52
    function createSectorAndLabel(layout, text, hasAnimation) {
        var shape = zrUtil.extend({}, layout);
        delete shape.label;

        var sector = new graphic.Sector({
            shape: shape
        });

        var labelLayout = layout.label;
        var labelLine = new graphic.Polyline({
            shape: {
                points: labelLayout.linePoints
L
lang 已提交
53 54
            },
            silent: true
L
lang 已提交
55 56 57 58 59 60 61 62
        });

        var labelText = new graphic.Text({
            style: {
                text: text,
                textAlign: labelLayout.textAlign,
                textBaseline: labelLayout.textBaseline,
                font: labelLayout.font
L
lang 已提交
63 64 65 66
            },
            rotation: labelLayout.rotation,
            position: [labelLayout.x, labelLayout.y],
            silent: true
L
lang 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
        });

        sector.__labelLine = labelLine;
        sector.__labelText = labelText;

        if (hasAnimation) {
            sector.shape.endAngle = layout.startAngle;
            sector.animateTo({
                shape: {
                    endAngle: layout.endAngle
                }
            }, 300, 'cubicOut');
        }

        return sector;
    }

L
Add pie  
lang 已提交
84
    var Pie = require('../../view/Chart').extend({
L
lang 已提交
85

L
Add pie  
lang 已提交
86
        type: 'pie',
L
lang 已提交
87

L
lang 已提交
88 89 90 91 92
        init: function () {
            var sectorGroup = new graphic.Group();
            this._sectorGroup = sectorGroup;
        },

L
lang 已提交
93
        render: function (seriesModel, ecModel, api) {
L
Add pie  
lang 已提交
94 95
            var data = seriesModel.getData();
            var oldData = this._data;
L
lang 已提交
96
            var sectorGroup = this._sectorGroup;
L
Add pie  
lang 已提交
97
            var group = this.group;
L
lang 已提交
98 99 100 101 102 103 104

            var hasAnimation = ecModel.get('animation');
            var isFirstRender = !oldData;

            var firstSector;
            var onSectorClick = zrUtil.curry(selectData, seriesModel);

L
lang 已提交
105 106
            var selectedMode = seriesModel.get('selectedMode');

L
Add pie  
lang 已提交
107 108
            data.diff(oldData)
                .add(function (idx) {
L
lang 已提交
109
                    var layout = data.getItemLayout(idx);
L
Add pie  
lang 已提交
110

L
lang 已提交
111
                    var sector = createSectorAndLabel(
L
lang 已提交
112
                        layout, '', hasAnimation && !isFirstRender
L
lang 已提交
113
                    );
L
lang 已提交
114

L
lang 已提交
115 116
                    selectedMode
                        && sector.on('click', onSectorClick);
L
lang 已提交
117 118

                    data.setItemGraphicEl(idx, sector);
L
lang 已提交
119 120 121 122 123

                    sectorGroup.add(sector);

                    group.add(sector.__labelLine);
                    group.add(sector.__labelText);
L
lang 已提交
124 125

                    firstSector = firstSector || sector;
L
Add pie  
lang 已提交
126 127 128
                })
                .update(function (newIdx, oldIdx) {
                    var sector = oldData.getItemGraphicEl(oldIdx);
L
lang 已提交
129 130 131
                    var layout = data.getItemLayout(newIdx);
                    var labelLayout = layout.label;

L
lang 已提交
132 133 134 135 136 137
                    var labelLine = sector.__labelLine;
                    var labelText = sector.__labelText;

                    selectedMode
                        ? sector.on('click', onSectorClick)
                        : sector.off('click');
L
lang 已提交
138

L
lang 已提交
139 140 141 142 143 144 145 146
                    api.updateGraphicEl(sector, {
                        shape: layout
                    });
                    labelLine && api.updateGraphicEl(labelLine, {
                        shape: {
                            points: labelLayout.linePoints
                        }
                    });
L
lang 已提交
147
                    if (labelText) {
L
lang 已提交
148
                        api.updateGraphicEl(labelText, {
L
lang 已提交
149 150
                            position: [labelLayout.x, labelLayout.y],
                            rotation: labelLayout.rotation
L
lang 已提交
151 152 153 154 155 156
                        });
                        labelText.setStyle({
                            textAlign: labelLayout.textAlign,
                            textBaseline: labelLayout.textBaseline,
                            font: labelLayout.font
                        });
L
lang 已提交
157
                    }
L
lang 已提交
158 159

                    sectorGroup.add(sector);
L
lang 已提交
160
                    data.setItemGraphicEl(newIdx, sector);
L
lang 已提交
161 162 163

                    group.add(labelLine);
                    group.add(labelText);
L
Add pie  
lang 已提交
164 165 166
                })
                .remove(function (idx) {
                    var sector = oldData.getItemGraphicEl(idx);
L
lang 已提交
167 168 169 170
                    sectorGroup.remove(sector);

                    group.remove(sector.__labelLine);
                    group.remove(sector.__labelText);
L
Add pie  
lang 已提交
171 172 173
                })
                .execute();

L
lang 已提交
174 175 176 177
            if (hasAnimation && isFirstRender && firstSector) {
                var shape = firstSector.shape;
                var r = Math.max(api.getWidth(), api.getHeight()) / 2;

L
lang 已提交
178 179
                var removeClipPath = zrUtil.bind(sectorGroup.removeClipPath, sectorGroup);
                sectorGroup.setClipPath(this._createClipPath(
L
lang 已提交
180 181 182 183
                    shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath
                ));
            }

L
lang 已提交
184 185 186 187
            // Make sure sectors is on top of labels
            group.remove(sectorGroup);
            group.add(sectorGroup);

L
lang 已提交
188 189 190 191 192 193
            this._updateAll(data, seriesModel);

            this._data = data;
        },

        _updateAll: function (data, seriesModel) {
L
lang 已提交
194
            var selectedOffset = seriesModel.get('selectedOffset');
L
Add pie  
lang 已提交
195 196
            data.eachItemGraphicEl(function (sector, idx) {
                var itemModel = data.getItemModel(idx);
L
lang 已提交
197
                var itemStyleModel = itemModel.getModel('itemStyle');
L
lang 已提交
198

L
Add pie  
lang 已提交
199 200 201 202 203
                sector.setStyle(
                    zrUtil.extend(
                        {
                            fill: data.getItemVisual(idx, 'color')
                        },
L
lang 已提交
204
                        itemStyleModel.getModel('normal').getItemStyle()
L
Add pie  
lang 已提交
205 206 207 208
                    )
                );
                graphic.setHoverStyle(
                    sector,
L
lang 已提交
209
                    itemStyleModel.getModel('emphasis').getItemStyle()
L
Add pie  
lang 已提交
210
                );
L
lang 已提交
211

L
lang 已提交
212 213 214 215 216 217 218 219
                var labelText = sector.__labelText;
                if (labelText) {
                    labelText.setStyle({
                        text: seriesModel.getFormattedLabel(idx, 'normal')
                            || data.getName(idx)
                    });
                }

L
lang 已提交
220 221 222 223 224 225
                updateSelected(
                    sector,
                    data.getItemLayout(idx),
                    itemModel.get('selected'),
                    selectedOffset
                );
L
lang 已提交
226 227 228 229 230 231 232 233 234 235 236 237 238 239
            });
        },

        _createClipPath: function (cx, cy, r, startAngle, clockwise, cb) {
            var clipPath = new graphic.Sector({
                shape: {
                    cx: cx,
                    cy: cy,
                    r0: 0,
                    r: r,
                    startAngle: startAngle,
                    endAngle: startAngle,
                    clockwise: clockwise
                }
L
Add pie  
lang 已提交
240
            });
L
lang 已提交
241 242 243 244 245 246 247 248

            clipPath.animateTo({
                shape: {
                    endAngle: startAngle + Math.PI * 2
                }
            }, 1000, 'cubicOut', cb);

            return clipPath;
L
lang 已提交
249 250 251 252 253 254 255
        },

        dispose: function () {}
    });

    return Pie;
});