Add pinch/pan/double-tap zoom to the full-screen photo viewer, mirroring the web viewer semantics: - scale is a multiplier of the natural size, capped at 200%; the fitted view is the lower bound - double tap toggles fitted view <-> 100% natural anchored at the tap - the original loads on zoom, with the preview kept as a placeholder so entering zoom never flashes a black surface - the pager is disabled while zoomed (drags pan the image) and the zoom resets when leaving a photo - video and 360 panoramas are unaffected Implement PhotoZoom (zoom math) and ZoomableImage (gestures), wire it into ViewerContent/MediaPage, and cover it with unit, Compose and device tests. OpenSpec change: add-mobile-photo-zoom
4.9 KiB
Spec Delta
MODIFIED Requirements
Requirement: Просмотр медиа на весь экран
Полноэкранный просмотр SHALL поддерживать изображение с зумом пальцами, видео с постером и управлением воспроизведением, а также панораму 360; навигация между элементами альбома SHALL выполняться свайпом.
Scenario: Свайп между элементами
- WHEN пользователь свайпает в просмотре
- THEN показывается следующий или предыдущий элемент альбома без выхода из просмотра
Scenario: Видео
- WHEN открыт видеоэлемент
- THEN показывается постер и доступно воспроизведение с перемоткой
ADDED Requirements
Requirement: Зум изображения жестами
Полноэкранный просмотр изображения SHALL поддерживать увеличение и уменьшение щипком (pinch), а при увеличенном изображении — панорамирование перетаскиванием.
Scenario: Щипок увеличивает изображение
- WHEN пользователь разводит пальцы на изображении
- THEN изображение увеличивается относительно вписанного вида
Scenario: Панорамирование при увеличении
- WHEN изображение увеличено, и пользователь перетаскивает его пальцем
- THEN видимая область изображения смещается, а границы изображения не отрываются от краёв области просмотра
Requirement: Двойной тап переключает вписанный вид и 100%
Двойной тап по изображению SHALL переключать вписанный вид и масштаб 100% натурального размера с якорем в точку нажатия.
Scenario: Вход в 100% из вписанного вида
- WHEN изображение показано вписанным, и пользователь делает двойной тап
- THEN изображение показывается в масштабе 100% натурального размера с центром в точке нажатия
Scenario: Возврат во вписанный вид
- WHEN изображение увеличено, и пользователь делает двойной тап
- THEN изображение возвращается во вписанный вид
Requirement: Предел зума по натуральному размеру
Зум изображения SHALL ограничиваться снизу вписанным видом, а сверху — 200% натурального размера изображения; при входе в зум SHALL догружаться оригинал изображения.
Scenario: Верхний предел
- WHEN пользователь продолжает увеличивать изображение за 200% натурального размера
- THEN масштаб останавливается на 200%, изображение не увеличивается дальше
Scenario: Оригинал при увеличении
- WHEN пользователь входит в зум
- THEN догружается оригинал изображения и подменяет превью по факту загрузки
Requirement: Навигация и сброс при зуме
Пока изображение увеличено, горизонтальный свайп SHALL NOT листать альбом, а жест SHALL отдаваться панорамированию; при переходе на другой элемент просмотра зум SHALL сбрасываться во вписанный вид.
Scenario: Свайп не листает увеличенное изображение
- WHEN изображение увеличено, и пользователь свайпает по нему
- THEN альбом не листается, а изображение панорамируется
Scenario: Сброс при смене фото
- WHEN пользователь переходит на другой элемент и возвращается к увеличенному изображению
- THEN изображение показывается во вписанном виде