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..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,27 +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) - var i = getStartDegree() - while (i < getEndDegree()) { - if (degree <= i) { - rayMarkPaint.color = markColor - canvas.drawPath(markPath, rayMarkPaint) - canvas.rotate(degreeBetweenMark.toFloat(), size * .5f, size * .5f) - i += degreeBetweenMark - continue + + val zeroDegree = getRayStartDegree() + val rangeCheck = if (degree <= zeroDegree) { + degree.toInt()..zeroDegree.toInt() + } else { + zeroDegree.toInt()..degree.toInt() + } + + for (i in getStartDegree()..getEndDegree() step degreeBetweenMark) { + val drawWith = if (!rangeCheck.contains(i)) { + rayMarkPaint.apply { + color = markColor + } + } else { + activeMarkPaint.apply { + color = currentSection?.color ?: 0 + } } - 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.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 @@ +