В настоящее время я работаю над приложением музыкального проигрывателя, которое отображает форму волны песни. Я решил нарисовать форму волны, используя 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)
}
Итак, чтобы не создавать траекторию при каждом отрисовке, можно ли обрезать содержимое контура, чтобы оно было только видимыми границами, прежде чем пытаться нарисовать его на холсте?