From b24cf90af534bdcb02919f384b5bbafbfd85bc24 Mon Sep 17 00:00:00 2001 From: Taosif7 Date: Fri, 16 Oct 2020 17:52:35 +0530 Subject: [PATCH] - Now Added option to show/hide labels --- .idea/compiler.xml | 6 +++ .idea/gradle.xml | 1 + .idea/misc.xml | 2 +- .../android/ringchartlib/RingChart.java | 44 +++++++++++++++++-- .../ringchartlib/models/RingChartData.java | 14 ------ .../android/ringchart/MainActivity.java | 15 ++++++- app/src/main/res/layout/activity_main.xml | 34 ++++++++++++-- 7 files changed, 93 insertions(+), 23 deletions(-) create mode 100644 .idea/compiler.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 59e46b1..1f5faef 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -16,6 +16,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 37a7509..d5d35ec 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/RingChart.java b/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/RingChart.java index 6115c35..87ffd4a 100644 --- a/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/RingChart.java +++ b/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/RingChart.java @@ -9,6 +9,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.RectF; import android.util.AttributeSet; import android.util.Property; @@ -44,6 +45,7 @@ public class RingChart extends ViewGroup { // Properties private RingView backgroundRing; private renderMode mode = renderMode.MODE_OVERLAP; + private boolean showLabels = true; public RingChart(Context ctx) { super(ctx); @@ -92,7 +94,8 @@ private void init() { // Add background ring if its overlap mode if (mode == renderMode.MODE_OVERLAP) { - backgroundRing = new RingView(getContext(), new RingChartData(1.0f, colorSecondary)); + backgroundRing = new RingView(getContext(), new RingChartData(1.0f, colorSecondary, "BackgroundRing-Kwv0Tv1HrB")); + backgroundRing.setShouldDrawLabel(false); addView(backgroundRing); } @@ -331,6 +334,10 @@ public void setLayoutMode(renderMode mode) { this.mode = mode; } + public void showLabels(boolean showLabels) { + this.showLabels = showLabels; + } + /** * Method to animate rings in indeterminate loading style */ @@ -457,9 +464,13 @@ public enum renderMode {MODE_OVERLAP, MODE_CONCENTRIC} */ protected class RingView extends View { private final RectF RingOval = new RectF(); + private int labelAngleOffset; + private float labelSize; + private boolean shouldDrawLabel = true; + private Path labelCirclePath; + private int bgColor; + private Paint colorPaint, labelPaint; RingChartData data; - int bgColor; - Paint colorPaint; float headAngle, tailAngle = 0f; public RingView(Context ctx, RingChartData data) { @@ -472,6 +483,7 @@ public RingView(Context ctx, RingChartData data) { this.colorPaint.setStrokeCap(Paint.Cap.ROUND); headAngle = (data.value * 360f); updateBgColor(); + updateLabelPaint(); } public void updateData(RingChartData ringData) { @@ -488,19 +500,45 @@ protected void onDraw(Canvas canvas) { canvas.drawArc(RingOval, 270f, 360f, false, colorPaint); colorPaint.setColor(data.color); } + canvas.drawArc(RingOval, 270f + tailAngle, headAngle, false, colorPaint); + + // Draw label + if (showLabels && shouldDrawLabel) { + if (mode == renderMode.MODE_CONCENTRIC) { + canvas.rotate(-92, RingOval.centerX(), RingOval.centerY()); + } else { + canvas.rotate((tailAngle + headAngle) - 90 - labelAngleOffset, RingOval.centerX(), RingOval.centerY()); + } + canvas.drawTextOnPath(data.label, labelCirclePath, 0, (width * 0.4f) / 2, labelPaint); + } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { RingOval.set(width, width /*[SIC]*/, w - width, h - width); this.colorPaint.setStrokeWidth(width); + updateLabelPaint(); } private void updateBgColor() { this.bgColor = ColorUtils.blendARGB(data.color, Color.BLACK, 0.4f); bgColor = ColorUtils.setAlphaComponent(bgColor, 30); } + + private void updateLabelPaint() { + labelPaint = new Paint(); + labelPaint.setColor(Color.WHITE); + labelPaint.setTextSize(width * 0.7f); + labelCirclePath = new Path(); + labelCirclePath.addCircle(RingOval.centerX(), RingOval.centerY(), RingOval.width() / 2f, Path.Direction.CW); + labelSize = labelPaint.measureText(data.label); + labelAngleOffset = (int) ((labelSize / (float) (Math.PI * RingOval.width())) * 360); + } + + public void setShouldDrawLabel(boolean shouldDraw) { + this.shouldDrawLabel = shouldDraw; + } } } diff --git a/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/models/RingChartData.java b/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/models/RingChartData.java index 8933c9b..33dc3b6 100644 --- a/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/models/RingChartData.java +++ b/RingChartLib/src/main/java/com/taosif7/android/ringchartlib/models/RingChartData.java @@ -2,25 +2,11 @@ import androidx.annotation.FloatRange; -import java.util.UUID; - public class RingChartData implements Comparable { public float value; public int color; public String label; - /** - * Doughnut ring data item - * - * @param value absolute Integer value - * @param color resolved int colour !!!NOT RESOURCE ID - */ - public RingChartData(@FloatRange(from = 0.0f, to = 1.0f) float value, int color) { - this.value = value; - this.color = color; - this.label = UUID.randomUUID().toString(); - } - /** * Doughnut ring data item * diff --git a/app/src/main/java/com/taosif7/android/ringchart/MainActivity.java b/app/src/main/java/com/taosif7/android/ringchart/MainActivity.java index e6013b3..3698415 100644 --- a/app/src/main/java/com/taosif7/android/ringchart/MainActivity.java +++ b/app/src/main/java/com/taosif7/android/ringchart/MainActivity.java @@ -1,10 +1,10 @@ package com.taosif7.android.ringchart; -import android.graphics.Color; import android.os.Bundle; import android.view.View; +import android.widget.CompoundButton; import android.widget.TextView; -import android.widget.Toast; +import android.widget.ToggleButton; import android.widget.ViewSwitcher; import androidx.appcompat.app.AppCompatActivity; @@ -36,6 +36,7 @@ protected void onCreate(Bundle savedInstanceState) { MaterialButton BTN_animStart = findViewById(R.id.animationStartBtn); MaterialButton BTN_animStop = findViewById(R.id.animationStopBtn); final ViewSwitcher VS_chartHolder = findViewById(R.id.chart_holder); + ToggleButton TB_labels = findViewById(R.id.toggle_labels); // Prepare Data dataPoints.put("red", (float) Math.random()); @@ -94,6 +95,16 @@ public void onClick(View view) { VS_chartHolder.showNext(); } }); + + TB_labels.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + chart_concentric.showLabels(b); + chart_overlap.showLabels(b); + chart_concentric.stopAnimateLoading(); + chart_overlap.stopAnimateLoading(); + } + }); } public void changeValue(View view) throws Exception { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3567081..5488420 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,6 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" + android:paddingBottom="20dp" android:theme="@style/Theme.MaterialComponents.DayNight"> + android:orientation="horizontal" + android:paddingStart="20dp" + android:paddingEnd="20dp"> - + + + + + + + +