Задать вопрос

Вывод на экран изображения высокого разрешения?

Доброго времени суток!

Я разрабатываю приложение, предназначенное для мониторинга состояния бортовой системы самолета. Приложение выводит на экран некоторую схему расположения элементов + набор датчиков (набор View). У схемы фиксированный размер (4096х4096), формат — PNG.

Что нужно:

1. Вывести схему на экран в реальном размере с возможностью скроллинга;

2. Сделать возможность масштабирования схемы.


Скроллинг у меня реализован с помощью стандартного компонента ScrollView на базе FrameLayout.


Проблемы начинаются при попытке вывода схемы на экран. Для отображения схемы я хотел сделать ImageView и установить для него картинку. Но у OpenGL в Android существует ограничение на размер текстуры — не более 2048х2048 пикселей, так что всю картинку засунуть в один компонент не получилось. Пришлось делать 9 ImageView, выстраивать их плиткой, и нарезать исходное изображение с помощью BitmapRegionDecoder.

Теперь еще нужно делать масштабирование всех этих элементов, и выглядит эта реализация как костыль. Видится мне, есть способ проще.


Может кто сталкивался с подобными задачами и может что посоветовать?
  • Вопрос задан
  • 5226 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
serso
@serso
На stackoverflow предлагают использовать WebView: link (но тайлы всё равно придётся нарезать)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alekseymenkov
@alekseymenkov Автор вопроса
Спасибо за толковую идею!
Реализовал требуемый функционал через WebView + FrameLayout.
В WebView создал дочерний FrameLayout, а уже во FrameLayout добавил все свои View. Получилось неплохо: работает прокрутка во все стороны (пропадает смысл использовать ScrollView), работает масштабирование (Pinch Zoom) — и все без особых тормозов. Единственный минус — не могу никак отследить коэффициент масштабирования WebView, чтобы пропорционально увеличивать собственные View.
Картинку нарезал на тайлы. Для 4096x4096 на реальном устройстве нарезка занимает примерно 10 секунд. В принципе, ее можно вынести в отдельный поток, перезагружая WebView по мере нарезки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы