From a957ffa3e4ca4b8539f88aba433d1d1815bc9314 Mon Sep 17 00:00:00 2001 From: ootr47 Date: Tue, 5 Dec 2023 16:12:26 +0900 Subject: [PATCH 1/5] feat: Add label string in ChartDataset --- .../java/app/priceguard/materialchart/data/ChartDataset.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/app/priceguard/materialchart/data/ChartDataset.kt b/src/main/java/app/priceguard/materialchart/data/ChartDataset.kt index 5d27f74..bff6667 100644 --- a/src/main/java/app/priceguard/materialchart/data/ChartDataset.kt +++ b/src/main/java/app/priceguard/materialchart/data/ChartDataset.kt @@ -5,6 +5,8 @@ interface ChartDataset { val showYAxis: Boolean val isInteractive: Boolean val graphMode: GraphMode + val xLabel: String + val yLabel: String val data: List val gridLines: List -} \ No newline at end of file +} From a2581d210b8de889734fbe889044e84d20276294 Mon Sep 17 00:00:00 2001 From: ootr47 Date: Tue, 5 Dec 2023 16:45:50 +0900 Subject: [PATCH 2/5] feat: Update touch point label text, Fix position --- .../app/priceguard/materialchart/Chart.kt | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/app/priceguard/materialchart/Chart.kt b/src/main/java/app/priceguard/materialchart/Chart.kt index 8d094e9..ec60982 100644 --- a/src/main/java/app/priceguard/materialchart/Chart.kt +++ b/src/main/java/app/priceguard/materialchart/Chart.kt @@ -628,6 +628,8 @@ class Chart @JvmOverloads constructor( val graphWidth = graphSpaceEndX - graphSpaceStartX val graphHeight = graphSpaceEndY - graphSpaceStartY + val pointXData = spaceX * ((pointX - graphSpaceStartX.value) /graphWidth.value) + minX + chartData.forEachIndexed { index, data -> if (index < size - 1) { val next = chartData[index + 1] @@ -643,7 +645,10 @@ class Chart @JvmOverloads constructor( circlePaint.setCirclePaint() canvas.drawCircle(pointX, startY.value, circleSize.value / 2, circlePaint) - val text = convertToText(data.y) + val text = + "${dataset?.xLabel ?: "x"} : ${convertTimeStampToDate(pointXData, dataset?.graphMode?: GraphMode.DAY)}," + + " ${dataset?.yLabel ?: "y"} : ${convertToText(data.y)}" + textLabelPaint.setTextLabelPaint() textLabelPaint.getTextBounds(text, 0, text.length, bounds) @@ -654,6 +659,15 @@ class Chart @JvmOverloads constructor( val rectWidth = bounds.width() val rectHeight = bounds.height() + + // Fix point label position when position is out of range + if(pointX - rectWidth / 2 - labelRectPaddingHorizontal.value < 0) { + pointX = rectWidth / 2 + labelRectPaddingHorizontal.value + } + if(pointX + rectWidth / 2 + labelRectPaddingHorizontal.value > width.toFloat()) { + pointX = width.toFloat() - rectWidth / 2 - labelRectPaddingHorizontal.value + } + val rect = RectF( pointX - rectWidth / 2 - labelRectPaddingHorizontal.value, startY.value - rectHeight - distanceTextAndPoint.value - labelRectPaddingVertical.value, @@ -664,6 +678,7 @@ class Chart @JvmOverloads constructor( textRectPaint.color = colorPrimaryContainer canvas.drawRoundRect(rect, 10f, 10f, textRectPaint) + canvas.drawText( text, pointX - bounds.width() / 2 - 4F, @@ -880,9 +895,7 @@ class Chart @JvmOverloads constructor( } private fun Paint.setTextLabelPaint() { - style = Paint.Style.FILL - typeface = Typeface.DEFAULT - textSize = 48F + textSize = 36F color = colorOnPrimaryContainer } From cfdafbf5f09f949128a4c5fe83fb88bfadfe8d1d Mon Sep 17 00:00:00 2001 From: ootr47 Date: Tue, 5 Dec 2023 17:12:09 +0900 Subject: [PATCH 3/5] refactor: reformat --- src/main/java/app/priceguard/materialchart/Chart.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/app/priceguard/materialchart/Chart.kt b/src/main/java/app/priceguard/materialchart/Chart.kt index ec60982..374c627 100644 --- a/src/main/java/app/priceguard/materialchart/Chart.kt +++ b/src/main/java/app/priceguard/materialchart/Chart.kt @@ -646,7 +646,7 @@ class Chart @JvmOverloads constructor( canvas.drawCircle(pointX, startY.value, circleSize.value / 2, circlePaint) val text = - "${dataset?.xLabel ?: "x"} : ${convertTimeStampToDate(pointXData, dataset?.graphMode?: GraphMode.DAY)}," + + "${dataset?.xLabel ?: "x"} : ${convertTimeStampToDate(pointXData, dataset?.graphMode ?: GraphMode.DAY)}," + " ${dataset?.yLabel ?: "y"} : ${convertToText(data.y)}" From ece4b5c4889091621ae4d30d149fcf5f58d4aa92 Mon Sep 17 00:00:00 2001 From: ootr47 Date: Tue, 5 Dec 2023 17:13:58 +0900 Subject: [PATCH 4/5] refactor: reformat --- src/main/java/app/priceguard/materialchart/Chart.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/app/priceguard/materialchart/Chart.kt b/src/main/java/app/priceguard/materialchart/Chart.kt index 374c627..eddbb26 100644 --- a/src/main/java/app/priceguard/materialchart/Chart.kt +++ b/src/main/java/app/priceguard/materialchart/Chart.kt @@ -628,7 +628,7 @@ class Chart @JvmOverloads constructor( val graphWidth = graphSpaceEndX - graphSpaceStartX val graphHeight = graphSpaceEndY - graphSpaceStartY - val pointXData = spaceX * ((pointX - graphSpaceStartX.value) /graphWidth.value) + minX + val pointXData = spaceX * ((pointX - graphSpaceStartX.value) / graphWidth.value) + minX chartData.forEachIndexed { index, data -> if (index < size - 1) { @@ -646,7 +646,12 @@ class Chart @JvmOverloads constructor( canvas.drawCircle(pointX, startY.value, circleSize.value / 2, circlePaint) val text = - "${dataset?.xLabel ?: "x"} : ${convertTimeStampToDate(pointXData, dataset?.graphMode ?: GraphMode.DAY)}," + + "${dataset?.xLabel ?: "x"} : ${ + convertTimeStampToDate( + pointXData, + dataset?.graphMode ?: GraphMode.DAY + ) + }," + " ${dataset?.yLabel ?: "y"} : ${convertToText(data.y)}" @@ -661,10 +666,10 @@ class Chart @JvmOverloads constructor( val rectHeight = bounds.height() // Fix point label position when position is out of range - if(pointX - rectWidth / 2 - labelRectPaddingHorizontal.value < 0) { + if (pointX - rectWidth / 2 - labelRectPaddingHorizontal.value < 0) { pointX = rectWidth / 2 + labelRectPaddingHorizontal.value } - if(pointX + rectWidth / 2 + labelRectPaddingHorizontal.value > width.toFloat()) { + if (pointX + rectWidth / 2 + labelRectPaddingHorizontal.value > width.toFloat()) { pointX = width.toFloat() - rectWidth / 2 - labelRectPaddingHorizontal.value } From 80a20452570b18b6934e589beb6e95cbdbf1aa20 Mon Sep 17 00:00:00 2001 From: ootr47 Date: Tue, 5 Dec 2023 17:24:47 +0900 Subject: [PATCH 5/5] feat: Disable touch event when touch range is outside the graph --- .../java/app/priceguard/materialchart/Chart.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/priceguard/materialchart/Chart.kt b/src/main/java/app/priceguard/materialchart/Chart.kt index eddbb26..afdda16 100644 --- a/src/main/java/app/priceguard/materialchart/Chart.kt +++ b/src/main/java/app/priceguard/materialchart/Chart.kt @@ -100,6 +100,7 @@ class Chart @JvmOverloads constructor( private val zeroDp = Dp(1F) private var pointX = 0f + private var pointY = 0f private var isDragging = false // Use Android theme @@ -193,10 +194,20 @@ class Chart @JvmOverloads constructor( } override fun onTouchEvent(event: MotionEvent?): Boolean { - if (dataset?.isInteractive != true) { + if (dataset?.isInteractive != true || event == null) { return false } - when (event?.action) { + pointX = event.x + pointY = event.y + + if (pointX < xAxisMarginStart.toPx(context).value + || pointX > width.toFloat() - xAxisMarginStart.toPx(context).value + || pointY < yAxisMarginEnd.toPx(context).value + || pointY > height.toFloat() - yAxisMarginEnd.toPx(context).value + ) { + return true + } + when (event.action) { MotionEvent.ACTION_DOWN -> { parent.requestDisallowInterceptTouchEvent(true) isDragging = true