以下是一个自定义 View 实现圆饼不同扇形区域颜色以及点击事件的示例代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class PieChartView extends View {

    private int[] colors = {Color.RED, Color.BLUE, Color.GREEN};
    private float[] data = {30, 40, 30}; // 每个扇形区域的数据比例
    private RectF pieRectF; // 圆饼的矩形区域
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private int selectedIndex = -1; // 选中的扇形区域索引

    public PieChartView(Context context) {
        super(context);
    }

    public PieChartView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PieChartView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        if (data.length == 0) {
            return;
        }

        float startAngle = 0;
        pieRectF = new RectF(0, 0, getWidth(), getHeight());

        for (int i = 0; i < data.length; i++) {
            paint.setColor(colors[i]);

            // 计算每个扇形区域的角度
            float sweepAngle = 360 * (data[i] / 100);

            // 绘制扇形区域
            canvas.drawArc(pieRectF, startAngle, sweepAngle, true, paint);

            // 如果选中的扇形区域,绘制选中效果
            if (i == selectedIndex) {
                paint.setColor(Color.WHITE);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(5);
                canvas.drawArc(pieRectF, startAngle, sweepAngle, true, paint);
            }

            // 更新下一个扇形区域的起始角度
            startAngle += sweepAngle;
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                float x = event.getX();
                float y = event.getY();

                // 计算点击的点与圆心的距离
                float distance = (float) Math.sqrt((x - getWidth() / 2) * (x - getWidth() / 2)
                        + (y - getHeight() / 2) * (y - getHeight() / 2));

                // 如果点击的点在圆饼内部,计算点击的角度
                if (distance <= getWidth() / 2) {
                    float clickAngle = (float) (Math.atan2(y - getHeight() / 2, x - getWidth() / 2) * 180 / Math.PI);
                    clickAngle = (clickAngle + 360) % 360;

                    // 判断点击的角度落在哪个扇形区域
                    float startAngle = 0;
                    for (int i = 0; i < data.length; i++) {
                        float sweepAngle = 360 * (data[i] / 100);
                        if (clickAngle >= startAngle && clickAngle <= startAngle + sweepAngle) {
                            selectedIndex = i;
                            break;
                        }
                        startAngle += sweepAngle;
                    }

                    // 重绘视图
                    invalidate();
                }
                break;
        }

        return super.onTouchEvent(event);
    }
}

在布局文件中使用该自定义 View:

<com.example.PieChartView
    android:layout_width="match_parent"
    android:layout_height="300dp" />

通过设置 colors 数组和 data 数组,可以自定义不同扇形区域的颜色和数据比例。点击扇形区域时,会根据点击位置计算出点击的扇形区域索引,并通过重绘视图来实现选中效果

android 自定义 View 实现圆饼不同扇形区域颜色以及点击事件的代码

原文地址: https://www.cveoy.top/t/topic/h3wZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录