diff --git a/library/src/main/java/com/dzeio/charts/ChartType.kt b/library/src/main/java/com/dzeio/charts/ChartType.kt new file mode 100644 index 0000000..dce29bd --- /dev/null +++ b/library/src/main/java/com/dzeio/charts/ChartType.kt @@ -0,0 +1,21 @@ +package com.dzeio.charts + +enum class ChartType { + + /** + * Basic Chart where items go over the other + */ + BASIC, + + /** + * each series are next to each other nicely + */ + GROUPED, + + /** + * WILL NOT DO ANYTHING CURRENTLY + * + * Each series are stacked over the other one + */ + STACKED +} \ No newline at end of file diff --git a/library/src/main/java/com/dzeio/charts/ChartView.kt b/library/src/main/java/com/dzeio/charts/ChartView.kt index fed5dc9..63258a8 100644 --- a/library/src/main/java/com/dzeio/charts/ChartView.kt +++ b/library/src/main/java/com/dzeio/charts/ChartView.kt @@ -21,6 +21,8 @@ class ChartView @JvmOverloads constructor(context: Context?, attrs: AttributeSet const val TAG = "Charts/ChartView" } + override var type: ChartType = ChartType.BASIC + override var debug: Boolean = false override val xAxis = XAxis(this) diff --git a/library/src/main/java/com/dzeio/charts/ChartViewInterface.kt b/library/src/main/java/com/dzeio/charts/ChartViewInterface.kt index b566f21..c1ae574 100644 --- a/library/src/main/java/com/dzeio/charts/ChartViewInterface.kt +++ b/library/src/main/java/com/dzeio/charts/ChartViewInterface.kt @@ -6,6 +6,11 @@ import com.dzeio.charts.series.SerieInterface interface ChartViewInterface { + /** + * Chart Type + */ + var type: ChartType + /** * Make the whole view in debug mode * diff --git a/library/src/main/java/com/dzeio/charts/axis/XAxis.kt b/library/src/main/java/com/dzeio/charts/axis/XAxis.kt index 26062d5..a6833e2 100644 --- a/library/src/main/java/com/dzeio/charts/axis/XAxis.kt +++ b/library/src/main/java/com/dzeio/charts/axis/XAxis.kt @@ -5,6 +5,7 @@ import android.graphics.Color import android.graphics.Paint import android.graphics.Rect import android.graphics.RectF +import com.dzeio.charts.ChartType import com.dzeio.charts.ChartViewInterface import com.dzeio.charts.Entry import kotlin.math.roundToInt @@ -51,11 +52,13 @@ class XAxis( } override fun getPositionOnRect(entry: Entry, drawableSpace: RectF): Double { - return translatePositionToRect(entry.x, drawableSpace) - } - - fun translatePositionToRect(value: Double, drawableSpace: RectF): Double { - return drawableSpace.width() * (value - x) / getDataWidth() + val result = drawableSpace.width() * (entry.x - x) / getDataWidth() + if (view.type == ChartType.GROUPED) { + val serie = view.series.find { it.entries.contains(entry) } + val index = view.series.indexOf(serie) + return result + getEntryWidth(drawableSpace) * index + spacing / 2 * index + } + return result } override fun getXMax(): Double { @@ -123,8 +126,15 @@ class XAxis( } } - return (drawableSpace.width() * smallest / getDataWidth() - spacing) + val result = (drawableSpace.width() * smallest / getDataWidth() - spacing) .coerceIn(1.0, drawableSpace.width().toDouble()) + + // handle grouped series + if (view.type == ChartType.GROUPED) { + return result / view.series.size - spacing / 2 * (view.series.size - 1) + } + + return result } override fun getDataWidth(): Double { diff --git a/sample/src/main/java/com/dzeio/chartstest/ui/MainFragment.kt b/sample/src/main/java/com/dzeio/chartstest/ui/MainFragment.kt index 370710f..7b2ea91 100644 --- a/sample/src/main/java/com/dzeio/chartstest/ui/MainFragment.kt +++ b/sample/src/main/java/com/dzeio/chartstest/ui/MainFragment.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import com.dzeio.charts.ChartType import com.dzeio.charts.ChartView import com.dzeio.charts.Entry import com.dzeio.charts.series.BarSerie @@ -30,21 +31,27 @@ class MainFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.chart1.apply { + binding.chartGrouped.apply { // setup the Serie - val serie = BarSerie(this) + val serie1 = BarSerie(this) + val serie2 = BarSerie(this) + + // transform the chart into a grouped chart + type = ChartType.GROUPED // utils function to use Material3 auto colors materielTheme(this, requireView()) + serie2.barPaint.color = Color.RED // give the serie it's entries - serie.entries = generateRandomDataset(10) + serie1.entries = generateRandomDataset(10) + serie2.entries = generateRandomDataset(10) // refresh the Chart refresh() } - binding.chart2.apply { + binding.chartLine.apply { // setup the Serie val serie = LineSerie(this) @@ -58,7 +65,21 @@ class MainFragment : Fragment() { refresh() } - binding.chart3.apply { + binding.chartBar.apply { + // setup the Serie + val serie = BarSerie(this) + + // utils function to use Material3 auto colors + materielTheme(this, requireView()) + + // give the serie its entries + serie.entries = generateRandomDataset(10) + + // refresh the Chart + refresh() + } + + binding.chartCustomization.apply { // setup the Series val serie1 = BarSerie(this) val serie2 = LineSerie(this) diff --git a/sample/src/main/res/drawable/shape_divider.xml b/sample/src/main/res/drawable/shape_divider.xml new file mode 100644 index 0000000..a7e6373 --- /dev/null +++ b/sample/src/main/res/drawable/shape_divider.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/sample/src/main/res/layout/fragment_main.xml b/sample/src/main/res/layout/fragment_main.xml index 7dd6bee..eeaafe6 100644 --- a/sample/src/main/res/layout/fragment_main.xml +++ b/sample/src/main/res/layout/fragment_main.xml @@ -6,35 +6,39 @@ android:layout_height="match_parent" tools:context=".ui.MainFragment"> - - - + + + - - - + \ No newline at end of file