У меня svg файл в качестве ресурса. Он содержит около 2000 сложных детальных форм. Большинство фигур являются линиями Безье, которые можно преобразовать в android.graphics.Path. Мне нужно создать экран с функцией масштабирования / перевода для этого изображения.
Я попробовал классический способ:
val picture = Picture()
val canvas = picture.beginRecording(svgWidth, svgHeight)
paths.forEach { canvas.draw(it) }
picture.endRecording()
val pictureDrawable = PictureDrawable(picture)
imageView.setImageDrawable(pictureDrawable)
При таком подходе изображение отображается правильно, но в случае масштабирования или увеличения FPS начинает падать до 4-9. На старших устройствах он остается на 25. Так что это не приемлемо.
- В качестве второго решения я подготовил асинхронный поставщик кадров с несколькими растровыми слоями. Растровые изображения создаются на основе SVG. Есть слушатель изменения матрицы, который вызывает новый запрос кадра. Во время создания следующего кадра отображается предыдущий кадр, и пользователь может видеть изображение с артефактами в течение 40-100 мс из-за масштабированных растровых изображений. С этим решением FPS составляет 60, но качество изображения во время действий навигации изображения низкое. Это выглядит хорошо и удобно, но далеко от идеала.
Я проверил, как Chrome работает с svg, и похоже, что он отображает сетку растровых изображений, подготовленных асинхронно. Но после масштабирования он опускает предыдущую сетку, и мне нужно обеспечить плавную навигацию. Я ценю любые идеи. Спасибо
пс. На ios UIBezierPath отлично работают с тем же ресурсом.