From 755da30d289df6d7d14f34428b3bc756e691d1b8 Mon Sep 17 00:00:00 2001 From: Kyle Agronick Date: Sat, 6 Jan 2024 10:19:28 -0500 Subject: [PATCH 1/2] feat: ray draw from 0 --- .../anastr/speedviewlib/RaySpeedometer.kt | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt b/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt index ad695f3..f488f52 100644 --- a/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt +++ b/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt @@ -144,22 +144,27 @@ open class RaySpeedometer @JvmOverloads constructor( canvas.save() canvas.rotate(getStartDegree() + 90f, size * .5f, size * .5f) - var i = getStartDegree() - while (i < getEndDegree()) { - if (degree <= i) { + val zeroDegree = getDegreeAtSpeed(0f) + val drawingBackwards = degree <= zeroDegree + val rangeCheck = if (drawingBackwards) { + degree.toInt()..zeroDegree.toInt() + } else { + zeroDegree.toInt()..degree.toInt() + } + + for (i in getStartDegree()..getEndDegree() step degreeBetweenMark) { + if (!rangeCheck.contains(i)) { rayMarkPaint.color = markColor canvas.drawPath(markPath, rayMarkPaint) canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size * .5f) - i += degreeBetweenMark - continue + } else { + if (currentSection != null) + activeMarkPaint.color = currentSection!!.color + else + activeMarkPaint.color = 0 // transparent color + canvas.drawPath(markPath, activeMarkPaint) + canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size / 2f) } - if (currentSection != null) - activeMarkPaint.color = currentSection!!.color - else - activeMarkPaint.color = 0 // transparent color - canvas.drawPath(markPath, activeMarkPaint) - canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size / 2f) - i += degreeBetweenMark } canvas.restore() From eccdb8bed9328caff166a37d274619823803de04 Mon Sep 17 00:00:00 2001 From: Kyle Agronick Date: Sun, 7 Jan 2024 10:20:04 -0500 Subject: [PATCH 2/2] feat: make start ray speed configurable --- .../anastr/speedviewlib/RaySpeedometer.kt | 45 ++++++++++++------- speedviewlib/src/main/res/values/attrs.xml | 1 + 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt b/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt index f488f52..aeffced 100644 --- a/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt +++ b/speedviewlib/src/main/java/com/github/anastr/speedviewlib/RaySpeedometer.kt @@ -30,6 +30,7 @@ open class RaySpeedometer @JvmOverloads constructor( private var withEffects = true private var degreeBetweenMark = 5 + var rayStartSpeed: Float? = null var isWithEffects: Boolean get() = withEffects @@ -104,12 +105,21 @@ open class RaySpeedometer @JvmOverloads constructor( val a = context.theme.obtainStyledAttributes(attrs, R.styleable.RaySpeedometer, 0, 0) rayPaint.color = a.getColor(R.styleable.RaySpeedometer_sv_rayColor, rayPaint.color) - val degreeBetweenMark = a.getInt(R.styleable.RaySpeedometer_sv_degreeBetweenMark, this.degreeBetweenMark) - val rayMarkWidth = a.getDimension(R.styleable.RaySpeedometer_sv_rayMarkWidth, rayMarkPaint.strokeWidth) + val degreeBetweenMark = + a.getInt(R.styleable.RaySpeedometer_sv_degreeBetweenMark, this.degreeBetweenMark) + val rayMarkWidth = + a.getDimension(R.styleable.RaySpeedometer_sv_rayMarkWidth, rayMarkPaint.strokeWidth) rayMarkPaint.strokeWidth = rayMarkWidth activeMarkPaint.strokeWidth = rayMarkWidth - speedBackgroundPaint.color = a.getColor(R.styleable.RaySpeedometer_sv_speedBackgroundColor, speedBackgroundPaint.color) + speedBackgroundPaint.color = a.getColor( + R.styleable.RaySpeedometer_sv_speedBackgroundColor, + speedBackgroundPaint.color + ) withEffects = a.getBoolean(R.styleable.RaySpeedometer_sv_withEffects, withEffects) + rayStartSpeed = + a.getFloat(R.styleable.RaySpeedometer_sv_rayStartSpeed, Float.NEGATIVE_INFINITY).let { + if (it == Float.NEGATIVE_INFINITY) null else it + } a.recycle() isWithEffects = withEffects if (degreeBetweenMark in 1..20) @@ -139,32 +149,35 @@ open class RaySpeedometer @JvmOverloads constructor( updateBackgroundBitmap() } + open fun getRayStartDegree(): Float { + return getDegreeAtSpeed(rayStartSpeed ?: minSpeed) + } + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) canvas.save() canvas.rotate(getStartDegree() + 90f, size * .5f, size * .5f) - val zeroDegree = getDegreeAtSpeed(0f) - val drawingBackwards = degree <= zeroDegree - val rangeCheck = if (drawingBackwards) { + + val zeroDegree = getRayStartDegree() + val rangeCheck = if (degree <= zeroDegree) { degree.toInt()..zeroDegree.toInt() } else { zeroDegree.toInt()..degree.toInt() } for (i in getStartDegree()..getEndDegree() step degreeBetweenMark) { - if (!rangeCheck.contains(i)) { - rayMarkPaint.color = markColor - canvas.drawPath(markPath, rayMarkPaint) - canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size * .5f) + val drawWith = if (!rangeCheck.contains(i)) { + rayMarkPaint.apply { + color = markColor + } } else { - if (currentSection != null) - activeMarkPaint.color = currentSection!!.color - else - activeMarkPaint.color = 0 // transparent color - canvas.drawPath(markPath, activeMarkPaint) - canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size / 2f) + activeMarkPaint.apply { + color = currentSection?.color ?: 0 + } } + canvas.drawPath(markPath, drawWith) + canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size * .5f) } canvas.restore() diff --git a/speedviewlib/src/main/res/values/attrs.xml b/speedviewlib/src/main/res/values/attrs.xml index 861a7ef..19e8184 100644 --- a/speedviewlib/src/main/res/values/attrs.xml +++ b/speedviewlib/src/main/res/values/attrs.xml @@ -148,6 +148,7 @@ +