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
1.8 KiB
1.8 KiB
Tasks
1. Zoomable image component
- 1.1 Implement зум-математику (диапазон
[fitScale, 2.0], якорь в точку жеста) отдельным тестируемым помощником; проверить юнит-тестом клампы предела и пересчёт якоря при double-tap - 1.2 Реализовать слой жестов (pinch + панорамирование при зуме + double-tap) над изображением
через
pointerInput+graphicsLayer; проверить Compose-тестом (Robolectric) на pinch и double-tap - 1.3 Переключать источник на
originalUrlпри входе в зум, сохраняя cache key Coil; проверить, что запрос данных меняется приzoomedи не сбрасывает дисковый кэш
2. Viewer integration
- 2.1 Поднять
zoomedвViewerContentи учитывать его вpagerScrollEnabled; проверить Robolectric-тестом «свайп не листает увеличенное фото» - 2.2 Подключить zoomable-обёртку в ветку изображения
MediaPage; проверить тестом, что при переходе на другой элемент и обратно изображение показывается во вписанном виде
3. Integration verification
- 3.1 Прогнать
./gradlew testи./gradlew lintDebug; на эмуляторе вручную проверить pinch, панорамирование, double-tap, предел 200%, а также что видео и панорама не затронуты
Workflow follow-up
- Архив change после прохождения ревью проекта.