Я рисую несколько дуг на холсте по кругу, Это похоже на спидометр (но не спидометр), цвет дуги изменяется на цвет градиента, когда скорость достигает высокой, низкой или средней, но я хочу, чтобы цвет градиента былизменяется с анимацией, как если бы дуга была черного цвета, когда скорость становится высокой, дуга должна быть изменена на красный градиент с плавной анимацией градиента.
Я потратил впустую много времени.Пожалуйста, помогите мне разобраться.
Заранее спасибо.
Это onDraw()
код метода:
override fun onDraw(canvas: Canvas) {
val unitMinTempValue = Utils.getUnitCircleDegreeFromThermos(minTempValue.toFloat()).toFloat()
val unitMaxTempValue = Utils.getUnitCircleDegreeFromThermos(maxTempValue.toFloat()).toFloat()
val unitMinFixTempValue = Utils.getUnitCircleDegreeFromThermos(Const.minFixTemp.toFloat()).toFloat()
val unitMaxFixTempValue = Utils.getUnitCircleDegreeFromThermos(Const.maxFixTemp.toFloat()).toFloat()
matrixGradient = Matrix()
matrixGradient?.postRotate(15f)
canvas.drawArc(mRect!!, unitMinFixTempValue - 2.5f, unitMaxFixTempValue - unitMinFixTempValue + 4.5f, false, mPaintDefault!!)
if (isEnable) {
when (mode) {
Const.mode_heat_cool -> {
canvas.drawArc(mRect!!, unitMinTempValue - 2.5f, unitMaxTempValue - unitMinTempValue + 4.5f, false, mPaintBlack!!)
when (currentTempValue) {
in 43..(minTempValue - 1) -> {
positions = floatArrayOf(unitMinFixTempValue / 390, unitMinTempValue / 390)
setGradientPosition(Const.orange, positions)
canvas.drawArc(mRect!!, unitMinFixTempValue - 2.5f, unitMinTempValue - unitMinFixTempValue + 4.5f, false, mPaintOrange!!)
}
in minTempValue..(maxTempValue) -> {
canvas.drawArc(mRect!!, unitMinTempValue - 2.5f, unitMaxTempValue - unitMinTempValue + 4.5f, false, mPaintBlack!!)
}
in maxTempValue..97 -> {
positions = floatArrayOf(unitMaxTempValue / 390f, 1f)
setGradientPosition(Const.blue,position) canvas.drawArc(mRect!!, unitMaxTempValue - 2.5f, unitMaxFixTempValue - unitMaxTempValue + 4.5f, false, mPaintBlue!!)
}
}
}
}
}
}
private fun getRect(): RectF {
centerX = measuredWidth / 2
centerY = measuredHeight / 2
radius = Math.min(centerX, centerY)
val startTop = STROKE_WIDTH / 2
val endBottom = 2 * radius - startTop
return RectF(startTop.toFloat(), startTop.toFloat(), endBottom.toFloat(), endBottom.toFloat())
}
private fun setGradientPosition(type: String, positions: FloatArray) {
if (type == "blue") {
colorsBlue?.let {
val gradientBlue = SweepGradient(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, it, positions)
gradientBlue.setLocalMatrix(matrixGradient)
mPaintBlue?.shader = gradientBlue
}
} else {
colorsOrange?.let {
val gradientOrange = SweepGradient(measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2, it, positions)
gradientOrange.setLocalMatrix(matrixGradient)
mPaintOrange?.shader = gradientOrange
}
}
}
при перемещении красного штифта нарисуйте дугу под другим углом с другим цветом