egret 扇形图表

egret 扇形图表

最终效果:
在这里插入图片描述

//调用画图函数
this.drawArc(this, [
            { percentage: 0.6, color: 0xe34f4f },
            { percentage: 0.2, color: 0xffff00 },
            { percentage: 0.2, color: 0x00ff00 },
        ], 68)
/**扇形图表
     * @info 扇形比例总和为 1
     * @param container egret.DisplayObjectContainer 容器
     * @param sectorDates 扇形数据 {percentage:比例,color:颜色} 
     * @param radius number 半径
     * @param offset 图表偏移位置
     */
    private drawArc(container: egret.DisplayObjectContainer, sectorDates: { percentage: number, color: number }[], radius: number = 68, offset: number = 50): void {
        if (!sectorDates || sectorDates.length === 0) return;
        //图表偏移位置
        let i: number = 0, len: number = sectorDates.length;
        //偏移角度
        let offerAngle: number = 0;
        for (; i < len; i++) {
            let sectorDate = sectorDates[i];
            if (!sectorDate.percentage) continue;
            //计算角度
            let angle = sectorDate.percentage * 360;
            let curAngle = (angle + offerAngle);
            //起始弧度
            let startAngle = offerAngle * Math.PI / 180;
            //结束弧度
            let endAngle = curAngle * Math.PI / 180;
            //开始画扇形
            let sector: egret.Shape = new egret.Shape();
            sector.graphics.beginFill(sectorDate.color, 1);
            sector.graphics.moveTo(radius, radius)//绘制点移动(r, r)点
            sector.graphics.lineTo(radius * 2, radius);//画线到弧的起始点
            sector.graphics.drawArc(radius, radius, radius, startAngle, endAngle, false);//从起始点顺时针画弧到终点
            sector.graphics.lineTo(radius, radius);//从终点画线到圆形。到此扇形的封闭区域形成
            sector.graphics.endFill();
            sector.x = offset;
            sector.y = offset;
            container.addChild(sector);

            //------------------------------------------引导线--------------------------------------------
            //弧度中心点
            let center = offerAngle + angle * 0.5;
            let sins = Math.sin(2 * Math.PI / 360 * center);
            let coss = Math.cos(2 * Math.PI / 360 * center);
            let lineLen: number = 16;
            //起始点
            let startPoint = new egret.Point(coss * radius + radius, sins * radius + radius);
            //结束点
            let endPoint = new egret.Point();
            //延长线
            let addPoint = new egret.Point();
            let isLeft: boolean;

            if (center > 180) {//上
                endPoint.y = startPoint.y - lineLen;
            } else {//下
                endPoint.y = startPoint.y + lineLen;
            }
            if (center > 90 && center < 270) {//左
                endPoint.x = startPoint.x - lineLen;
                addPoint.x = endPoint.x - lineLen;
                isLeft = true;
            } else {//右
                endPoint.x = startPoint.x + lineLen;
                addPoint.x = endPoint.x + lineLen
            }
            addPoint.y = endPoint.y;

            //开始划线
            let line = new egret.Shape();
            line.graphics.lineStyle(2, sectorDate.color);
            line.graphics.moveTo(startPoint.x, startPoint.y);
            line.graphics.lineTo(endPoint.x, endPoint.y);
            line.graphics.lineTo(addPoint.x, addPoint.y);
            line.graphics.endFill();
            line.x = offset
            line.y = offset;
            container.addChild(line);

            //文本
            let label = new egret.TextField();
            label.text = Math.floor(sectorDate.percentage * 100) + "%"
            if (isLeft) label.x = offset + addPoint.x - label.width;
            else label.x = offset + addPoint.x
            label.y = offset + addPoint.y - label.height * 0.5;
            container.addChild(label);
            //角度偏移计算
            offerAngle += angle;
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值