Android MPAndroidChart 自定义圆饼图扇形阴影颜色

效果展示

设计图

在这里插入图片描述

最终实现

在这里插入图片描述

要实现阴影效果需要自定义PieChartRenderer

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

import com.github.mikephil.charting.animation.ChartAnimator;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.IPieDataSet;
import com.github.mikephil.charting.renderer.PieChartRenderer;
import com.github.mikephil.charting.utils.ViewPortHandler;

public class CustomPieChartRenderer extends PieChartRenderer {
   
   

    public CustomPieChartRenderer(PieChart chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
   
   
        super(chart, animator, viewPortHandler);
    }

    @Override
    protected void drawDataSet(Canvas c, IPieDataSet dataSet) {
   
   
        // 保存Canvas状态,防止状态污染
        c.save();

        // 获取总旋转角度
        float rotationAngle = mChart.getRotationAngle();

        // 获取饼图半径
        float radius = mChart.getRadius();

        // 获取总数据项的数量
        int entryCount = dataSet.getEntryCount();

        // 获取总的角度范围
        float totalAngle = 360f;

        // 手动计算数据集的总和
        float totalValue = 0f;
        for (int i = 0; i < entryCount; i++) {
   
   
            totalValue += dataSet.getEntryForIndex(i).getValue();
        }

        // 当前开始的角度
        float currentStartAngle = rotationAngle;

        // 遍历每个扇形
        for (int i = 0; i < entryCount; i++) {
   
   
            PieEntry entry = dataSet.getEntryForIndex(i);

            // 获取当前扇形的颜色
            int pieColor = dataSet.getColor(i);

            // 创建一个新的画笔,避免复用全局的Paint对象
            Paint renderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            Paint highlightPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

            // 提亮当前颜色生成阴影颜色
            int lighterShadowColor = lightenColor(pieColor, 0.1f);

            // 设置普通画笔的颜色和阴影
            renderPaint.setColor(pieColor);
            renderPaint.setShadowLayer(40f, 0f, 0f, lighterShadowColor);

            // 计算当前扇形的角度,基于该项的值占总和的百分比
            float sliceAngle = totalAngle * (entry.getValue() / totalValue);

            // 判断当前扇形是否高亮
            if (isEntryHighlighted(i)) {
   
   
                // 每个高亮扇形的颜色和阴影
                highlightPaint.setColor(pieColor);
                highlightPaint.setShadowLayer(60f, 0f, 0f, lightenColor(pieColor, 0.1f));

                // 使用高亮画笔绘制高亮的扇形
                c.drawArc(
                        mChart.getCircleBox(),         // 饼图的圆形区域
                        currentStartAngle,             // 当前扇形的起始角度
                        sliceAngle,                    // 当前扇形的角度范围
                        true,                          // 是否使用圆心
                        highlightPaint                 // 使用高亮画笔
                );
            } else {
   
   
                // 使用普通画笔绘制普通的扇形
                c.drawArc(
                        mChart.getCircleBox(),         // 饼图的圆形区域
                        currentStartAngle,             // 当前扇形的起始角度
                        sliceAngle,                    // 当前扇形的角度范围
                        true,                          // 是否使用圆心
                        renderPaint                    // 使用普通画笔
                );
            }

            // 更新下一个扇形的起始角度
            currentStartAngle += sliceAngle;
        }

        // 恢复Canvas状态
        c.restore();
    }

    // 检查当前项是否是高亮项
    private boolean isEntryHighlighted(int index) {
   
   
        Highlight[] highlights = mChart.getHighlighted();
        if (highlights != null && highlights.length > 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值