@Override public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int p = startAngle; int total = -1; for (PieSlice entry : entries) { total += entry.getValue(); } for (int i = 0; i < entries.size(); i++) { PieSlice entry = entries.get(i); g2d.setColor(entry.getColor()); double val = entry.getValue(); double angle = (val / total) * 360; g2d.fillArc(0, 0, super.getWidth(), super.getWidth(), p, (int) angle); p = (int) (p + angle); } }
public void onDraw(Canvas canvas) { canvas.drawColor(Color.TRANSPARENT); paint.reset(); paint.setAntiAlias(true); float midX, midY, radius, innerRadius; path.reset(); float currentAngle = 270; float currentSweep; int totalValue = 0; float padding = 2; midX = getWidth() / 2; midY = getHeight() / 2; if (midX < midY) { radius = midX; } else { radius = midY; } radius -= padding; innerRadius = radius - thickness; for (PieSlice slice : slices) { totalValue += slice.getValue(); } int count = 0; for (PieSlice slice : slices) { Path p = new Path(); paint.setColor(slice.getColor()); currentSweep = (slice.getValue() / totalValue) * (360); p.arcTo( new RectF(midX - radius, midY - radius, midX + radius, midY + radius), currentAngle + padding, currentSweep - padding); p.arcTo( new RectF(midX - innerRadius, midY - innerRadius, midX + innerRadius, midY + innerRadius), (currentAngle + padding) + (currentSweep - padding), -(currentSweep - padding)); p.close(); slice.setPath(p); slice.setRegion( new Region( (int) (midX - radius), (int) (midY - radius), (int) (midX + radius), (int) (midY + radius))); canvas.drawPath(p, paint); if (indexSelected == count && listener != null) { path.reset(); paint.setColor(slice.getColor()); paint.setColor(Color.parseColor("#33B5E5")); paint.setAlpha(100); if (slices.size() > 1) { path.arcTo( new RectF( midX - radius - (padding * 2), midY - radius - (padding * 2), midX + radius + (padding * 2), midY + radius + (padding * 2)), currentAngle, currentSweep + padding); path.arcTo( new RectF( midX - innerRadius + (padding * 2), midY - innerRadius + (padding * 2), midX + innerRadius - (padding * 2), midY + innerRadius - (padding * 2)), currentAngle + currentSweep + padding, -(currentSweep + padding)); path.close(); } else { path.addCircle(midX, midY, radius + padding, Direction.CW); } canvas.drawPath(path, paint); paint.setAlpha(255); } currentAngle = currentAngle + currentSweep; count++; } }