'public class PieChartView extends View {\n\n\tprivate List<Slice> slices; \n\tprivate Paint paint; \n\tprivate RectF rectF; \n\tprivate int selectedIndex = -1; \n\tprivate OnSliceClickListener listener; \n\n\tpublic PieChartView(Context context) { \n\t super(context); \n\t init(); \n\t} \n\n\tpublic PieChartView(Context context, @Nullable AttributeSet attrs) { \n\t super(context, attrs); \n\t init(); \n\t} \n\n\tprivate void init() { \n\t slices = new ArrayList<>(); \n\t paint = new Paint(Paint.ANTI_ALIAS_FLAG); \n\t rectF = new RectF(); \n\t} \n\n\tpublic void addSlice(float value, int color) { \n\t slices.add(new Slice(value, color)); \n\t invalidate(); \n\t} \n\n\tpublic void setOnSliceClickListener(OnSliceClickListener listener) { \n\t this.listener = listener; \n\t} \n\n\t@Override \n\tprotected void onDraw(Canvas canvas) { \n\t super.onDraw(canvas); \n\n\t float startAngle = 0; \n\t float totalValue = getTotalValue(); \n\n\t for (int i = 0; i < slices.size(); i++) { \n\t Slice slice = slices.get(i); \n\n\t float sweepAngle = 360 * (slice.value / totalValue); \n\t paint.setColor(slice.color); \n\t canvas.drawArc(rectF, startAngle, sweepAngle, true, paint); \n\n\t startAngle += sweepAngle; \n\n\t if (selectedIndex != -1 && i == selectedIndex) { \n\t paint.setColor(Color.WHITE); \n\t canvas.drawArc(rectF, startAngle - sweepAngle, sweepAngle, true, paint); \n\t } \n\t } \n\t} \n\n\t@Override \n\tprotected void onSizeChanged(int w, int h, int oldw, int oldh) { \n\t super.onSizeChanged(w, h, oldw, oldh); \n\n\t rectF.set(0, 0, w, h); \n\t} \n\n\t@Override \n\tpublic boolean onTouchEvent(MotionEvent event) { \n\t if (event.getAction() == MotionEvent.ACTION_DOWN) { \n\t float x = event.getX(); \n\t float y = event.getY(); \n\n\t float centerX = rectF.centerX(); \n\t float centerY = rectF.centerY(); \n\n\t double angle = Math.toDegrees(Math.atan2(y - centerY, x - centerX)); \n\t angle = (angle + 360) % 360; \n\n\t float startAngle = 0; \n\t float totalValue = getTotalValue(); \n\n\t for (int i = 0; i < slices.size(); i++) { \n\t Slice slice = slices.get(i); \n\n\t float sweepAngle = 360 * (slice.value / totalValue); \n\t if (angle >= startAngle && angle < startAngle + sweepAngle) { \n\t selectedIndex = i; \n\t invalidate(); \n\n\t if (listener != null) { \n\t listener.onSliceClick(i); \n\t } \n\t break; \n\t } \n\n\t startAngle += sweepAngle; \n\t } \n\t } \n\n\t return super.onTouchEvent(event); \n\t} \n\n\tprivate float getTotalValue() { \n\t float totalValue = 0; \n\t for (Slice slice : slices) { \n\t totalValue += slice.value; \n\t } \n\t return totalValue; \n\t} \n\n\tprivate static class Slice { \n\t float value; \n\t int color; \n\n\t public Slice(float value, int color) { \n\t this.value = value; \n\t this.color = color; \n\t } \n\t} \n\n\tpublic interface OnSliceClickListener { \n\t void onSliceClick(int index); \n\t} \n}','代码示例中使用了 OnSliceClickListener 接口来定义点击事件的回调方法,可以根据需要自定义点击事件的处理逻辑。

Android自定义圆饼图View实现不同扇形区域颜色和点击事件

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

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