Я хочу нарисовать дугу цветом, заполненным анимированным градиентом - PullRequest
0 голосов
/ 25 декабря 2018

Я рисую несколько дуг на холсте по кругу, Это похоже на спидометр (но не спидометр), цвет дуги изменяется на цвет градиента, когда скорость достигает высокой, низкой или средней, но я хочу, чтобы цвет градиента былизменяется с анимацией, как если бы дуга была черного цвета, когда скорость становится высокой, дуга должна быть изменена на красный градиент с плавной анимацией градиента.

Я потратил впустую много времени.Пожалуйста, помогите мне разобраться.

Заранее спасибо.

Это 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

        }

    }

}

enter image description here

enter image description here

при перемещении красного штифта нарисуйте дугу под другим углом с другим цветом

...