Маска для наклона на холсте спидометра

#android #android-layout #android-canvas

Вопрос:

Я просмотрел эту замечательную библиотеку спидометров, где они создали пользовательские спидометры на холсте. Короче говоря, они добавляли 2 изображения на фоне холста и переднем плане и перемещали прямоугольную маску изображения переднего плана всякий раз, когда менялось значение скорости.

Я попытался настроить код ImageLinearGauge, чтобы показать прогресс в вертикальном направлении со следующими изменениями :

  1. Сохранение фонового изображения(измерительный прибор) путем уменьшения значения альфа до 0
  2. Создан движущийся прямоугольник, состоящий из изображения переднего плана(заполнитель)
  3. При изменении значения прогресса на панели поиска прямоугольник в маске,созданный на шаге 2, появляется поверх фона, что создает ощущение прогресса.

введите описание изображения здесь

Мой Вопрос:

Я хочу, чтобы это изображение с маской на переднем плане было выровнено/перекрыто черными линиями, присутствующими в области розового цвета. Попробовал следующие подходы:

  1. поверните замаскированный прямоугольник на-20f вдоль его центра, но я мог видеть некоторые несоответствия в анимации.
     rect.set(0, heightPa - (heightPa * getOffsetSpeed()).toInt(), widthPa, heightPa)
    val mat = Matrix()
    mat.setRotate(-20f,  (widthPa/2).toFloat(),(heightPa - (heightPa * getOffsetSpeed()).toInt()/2).toFloat());
    mat.mapRect(rectF)
    canvas.translate(padding.toFloat(), padding.toFloat())
    canvas.drawBitmap(foregroundBitmap, rect, rectF, paint)
    canvas.translate((-padding).toFloat(), (-padding).toFloat())
     
  2. Попробовал повернуть холст — сохранение,вращение , рисование и восстановление холста , вся розовая область поворачивается.
         canvas.rotate(-20f);//,  (widthPa/2).toFloat(),(heightPa - (heightPa * getOffsetSpeed()).toInt()/2).toFloat());
        mat.mapRect(rectF)
        canvas.translate(padding.toFloat(), padding.toFloat())
        canvas.drawBitmap(foregroundBitmap, rect, rectF, paint)
        canvas.translate((-padding).toFloat(), (-padding).toFloat())
        canvas.restore();
     

Есть ли какой-нибудь другой подход, могу я попробовать? Пожалуйста, предложите!!