Android: можно ли обрезать контур перед рисованием на холсте - PullRequest
0 голосов
/ 11 июня 2019

В настоящее время я работаю над приложением музыкального проигрывателя, которое отображает форму волны песни. Я решил нарисовать форму волны, используя Android Path API и пользовательский Drawable. Путь будет простым набором линий, представляющих форму волны в единичной шкале XY (0-1), которая затем может быть преобразована через матрицу в размер пикселя, необходимый во время рисования. Нормализованный путь может быть сгенерирован в фоновом потоке один раз, а затем просто нарисован при каждом обновлении экрана. Я столкнулся с проблемой с устройствами с высоким разрешением, где текстура была бы абсолютно массивной, поэтому вместо этого я пошел рисовать только видимую часть формы волны. К сожалению, у меня все еще есть проблема, поскольку весь путь определяет слишком большую фигуру, чтобы нарисовать ее для текстуры.

Вот мой текущий код розыгрыша:

override fun draw(canvas: Canvas) {
    val bounds = copyBounds()
    println("Current Bounds: ${bounds.width()} x ${bounds.height()}")
    val matrix = Matrix().apply {
        // scale height to 75% of view height, and width to size of song in the form of DIPs per Second
        setScale(actualWidth, bounds.height() * 0.75f)
        val halfWidth = bounds.width() / 2f
        // Translate along the X axis to the current play time, and the Y to the centre of the view
        postTranslate(halfWidth - timescaleToPixels(offsetTime), bounds.height() / 2f)
    }
    tempPath.rewind()
    path.transform(matrix, tempPath)
    canvas.drawPath(tempPath, paint)
}

Итак, чтобы не создавать траекторию при каждом отрисовке, можно ли обрезать содержимое контура, чтобы оно было только видимыми границами, прежде чем пытаться нарисовать его на холсте?

...