Skip to content

Commit 7b83ffa

Browse files
committed
Fixed empty pie chart.
1 parent 6f0f9ef commit 7b83ffa

File tree

4 files changed

+72
-41
lines changed

4 files changed

+72
-41
lines changed

app/src/main/java/com/faskn/clickablepiechart/MainActivity.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@ class MainActivity : AppCompatActivity() {
1515
chart.setCenterColor(R.color.white)
1616

1717
// Example
18-
/* val pieChart0 = PieChart.Builder(
19-
arrayOf(
20-
Slice(30f, R.color.colorPrimary),
21-
Slice(60f, R.color.colorPrimaryDark),
22-
Slice(120f, R.color.materialIndigo600),
23-
Slice(150f, R.color.colorAccent)
24-
)
25-
).setSliceStartPoint(-90f)
26-
.setClickListener { string, float ->
27-
Log.d("ses", "s " + string)
28-
Log.d("ses", "f " + float.toString())
29-
}
30-
.build()*/
18+
/* val pieChart0 = PieChart.Builder(
19+
arrayOf(
20+
Slice(30f, R.color.colorPrimary),
21+
Slice(60f, R.color.colorPrimaryDark),
22+
Slice(120f, R.color.materialIndigo600),
23+
Slice(150f, R.color.colorAccent)
24+
)
25+
).setSliceStartPoint(-90f)
26+
.setClickListener { string, float ->
27+
Log.d("ses", "s " + string)
28+
Log.d("ses", "f " + float.toString())
29+
}
30+
.build()*/
3131

3232
// Example 2
3333
val pieChart1 = PieChart.Builder(
@@ -44,6 +44,16 @@ class MainActivity : AppCompatActivity() {
4444
}
4545
.build()
4646

47+
// Example 3
48+
/*val pieChart3 = PieChart.Builder(
49+
null
50+
)
51+
.setClickListener { string, float ->
52+
Log.d("ses", "s " + string)
53+
Log.d("ses", "f " + float.toString())
54+
}
55+
.build()*/
56+
4757
chart.setPieChart(pieChart1)
4858
}
4959
}

lib/src/main/java/com/faskn/lib/ClickablePieChart.kt

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class ClickablePieChart @JvmOverloads constructor(
4242

4343
// PieChart variables
4444
private var pieChart: PieChart? = null
45-
private lateinit var slices: List<Slice>
45+
private var slices: List<Slice>? = null
4646

4747
// Animation variables
4848
private var animator: ValueAnimator? = null
@@ -79,7 +79,7 @@ class ClickablePieChart @JvmOverloads constructor(
7979
}
8080

8181
private fun initSlices() {
82-
slices = pieChart?.slices?.toList()!!
82+
slices = pieChart?.slices?.toList()
8383
}
8484

8585
private fun startAnimation() {
@@ -109,8 +109,12 @@ class ClickablePieChart @JvmOverloads constructor(
109109
override fun onDraw(canvas: Canvas?) {
110110
super.onDraw(canvas)
111111

112-
if (pieChart != null) {
113-
slices.forEach { slice ->
112+
val centerX = (measuredWidth / 2).toFloat()
113+
val centerY = (measuredHeight / 2).toFloat()
114+
val radius = centerX.coerceAtMost(centerY)
115+
116+
if (slices.isNullOrEmpty().not()) {
117+
slices?.forEach { slice ->
114118
val arc = slice.arc!!
115119
if (currentSweepAngle > arc.startAngle + arc.sweepAngle) {
116120
slicePaint.color = ContextCompat.getColor(context, slice.color)
@@ -135,16 +139,24 @@ class ClickablePieChart @JvmOverloads constructor(
135139
}
136140
}
137141

138-
val centerX = (measuredWidth / 2).toFloat()
139-
val centerY = (measuredHeight / 2).toFloat()
140-
val radius = centerX.coerceAtMost(centerY)
141-
142142
canvas!!.drawCircle(
143143
rectF!!.centerX(),
144144
rectF!!.centerY(),
145145
radius - pieChart?.sliceWidth!!,
146146
centerPaint
147147
)
148+
149+
} else {
150+
val width = pieChart?.sliceWidth ?: 80f
151+
slicePaint.color = ContextCompat.getColor(context, R.color.semiGray)
152+
canvas!!.drawArc(rectF!!, 0f, 360f, true, slicePaint)
153+
canvas.drawCircle(
154+
rectF!!.centerX(),
155+
rectF!!.centerY(),
156+
radius - width,
157+
centerPaint
158+
)
159+
148160
}
149161
}
150162

@@ -171,7 +183,7 @@ class ClickablePieChart @JvmOverloads constructor(
171183

172184
var total = 0.0f
173185
var forEachStopper = false // what a idiot stuff
174-
slices.forEachIndexed { index, slice ->
186+
slices?.forEachIndexed { index, slice ->
175187
total += (slice.scaledValue ?: 0f) % 360f
176188
if (touchAngle <= total && !forEachStopper) {
177189
pieChart?.clickListener?.invoke(touchAngle.toString(), index.toFloat())
@@ -192,14 +204,19 @@ class ClickablePieChart @JvmOverloads constructor(
192204
val width = LinearLayout.LayoutParams.WRAP_CONTENT
193205
val height = LinearLayout.LayoutParams.WRAP_CONTENT
194206
val popupWindow = PopupWindow(popupView, width, height, true)
195-
var center = slices[index].arc?.average()!! + pieChart?.sliceStartPoint?.toDouble()!!
207+
var center = slices?.get(index)?.arc?.average()!! + pieChart?.sliceStartPoint?.toDouble()!!
196208
val halfRadius = rectF!!.centerX()
197209

198210
popupView.findViewById<TextView>(R.id.textViewPopupText).text =
199-
"${slices[index].dataPoint.toInt()} $popupText"
211+
"${slices?.get(index)!!.dataPoint.toInt()} $popupText"
200212
ImageViewCompat.setImageTintList(
201213
popupView.findViewById(R.id.imageViewPopupCircleIndicator),
202-
ColorStateList.valueOf(ContextCompat.getColor(context, slices[index].color))
214+
ColorStateList.valueOf(
215+
ContextCompat.getColor(
216+
context,
217+
slices?.get(index)?.color ?: R.color.semiGray
218+
)
219+
)
203220
)
204221

205222
val calculatedX =

lib/src/main/java/com/faskn/lib/PieChart.kt

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package com.faskn.lib
22

3-
import android.util.Log
4-
53
/**
64
* Created by turkergoksu on 12-Aug-20
75
*/
86

97
class PieChart private constructor(
10-
var slices: Array<Slice>,
8+
var slices: Array<Slice>?,
119
var clickListener: ((String, Float) -> Unit)? = null,
1210
var sliceStartPoint: Float = 0f,
13-
var sliceWidth: Float = 80f
11+
var sliceWidth: Float? = 80f
1412
) {
1513
data class Builder(
16-
private var slices: Array<Slice>,
14+
private var slices: Array<Slice>? = null,
1715
private var clickListener: ((String, Float) -> Unit)? = null,
1816
private var sliceStartPoint: Float? = 0f,
1917
private var sliceWidth: Float? = 80f
@@ -42,22 +40,24 @@ class PieChart private constructor(
4240
)
4341

4442
private fun initScaledArcs() {
45-
slices.forEachIndexed { i, slice ->
46-
val scaledValue = (slice.dataPoint / getSumOfDataPoints()) * 360
47-
slice.scaledValue = scaledValue
48-
if (i != 0) {
49-
slice.arc = Arc(
50-
slices[i - 1].arc?.sweepAngle!!,
51-
slices[i - 1].arc?.sweepAngle!!.plus(scaledValue)
52-
)
53-
} else {
54-
slice.arc = Arc(0f, scaledValue)
43+
if (slices != null) {
44+
slices!!.forEachIndexed { i, slice ->
45+
val scaledValue = (slice.dataPoint / getSumOfDataPoints()) * 360
46+
slice.scaledValue = scaledValue
47+
if (i != 0) {
48+
slice.arc = Arc(
49+
slices!![i - 1].arc?.sweepAngle!!,
50+
slices!![i - 1].arc?.sweepAngle!!.plus(scaledValue)
51+
)
52+
} else {
53+
slice.arc = Arc(0f, scaledValue)
54+
}
5555
}
5656
}
5757
}
5858

5959
private fun getSumOfDataPoints(): Float {
60-
return slices.sumByDouble { slice -> slice.dataPoint.toDouble() }.toFloat()
60+
return slices?.sumByDouble { slice -> slice.dataPoint.toDouble() }?.toFloat() ?: 0f
6161
}
6262
}
6363
}

lib/src/main/res/values/colors.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<color name="semiGray">#cecfd6</color>
4+
</resources>

0 commit comments

Comments
 (0)