diff --git a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt index 0cd7a03..834960c 100644 --- a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt +++ b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt @@ -115,6 +115,9 @@ fun GlassesMovieScreen( ) { Row( modifier = Modifier.fillMaxWidth().background(Color.Black), + // Видео в контейнере прижимается к верху (vertical=1) или низу (vertical=0): + // Row-центрирование съедало вертикаль — картинка оставалась «по центру». + verticalAlignment = Alignment.Top, horizontalArrangement = if (side == Side.LEFT) Arrangement.End else Arrangement.Start, ) { if (SCALE_DEBUG_SQUARE) { @@ -125,7 +128,9 @@ fun GlassesMovieScreen( BinocularVideoPlayer( player = player, renderer = renderer, - modifier = Modifier.size(playerWidth.px, playerHeight.px), + modifier = Modifier + .size(playerWidth.px, playerHeight.px) + .offset(y = videoOffsetY(containerH, playerHeight, vertical).px), ) } } @@ -155,6 +160,14 @@ fun scaleOffsetX(side: Side, screenWidthPx: Int, scale: Float): Int = fun verticalOffsetY(screenHeightPx: Int, scale: Float, vertical: Float): Int = ((1f - vertical) * screenHeightPx * (1f - scale)).toInt() +/** + * Смещение видео внутри контейнера глаза: vertical=1.0 — у верха контейнера, + * 0.0 — у низа (нижняя кромка видео прижата к низу контейнера, который сам + * у низа экрана при vertical=0). Row-центрирование иначе съедало вертикаль. + */ +fun videoOffsetY(containerHeightPx: Int, videoHeightPx: Int, vertical: Float): Int = + ((1f - vertical) * (containerHeightPx - videoHeightPx).coerceAtLeast(0)).toInt() + /** Отладочный режим: красный квадрат вместо видео (проверка масштаба/позиций скрином). Перед финалом — false. */ private const val SCALE_DEBUG_SQUARE = false diff --git a/app-glasses/src/test/kotlin/pw/binom/viewmate/glasses/ScaleOffsetTest.kt b/app-glasses/src/test/kotlin/pw/binom/viewmate/glasses/ScaleOffsetTest.kt index 292a1d5..07f37f1 100644 --- a/app-glasses/src/test/kotlin/pw/binom/viewmate/glasses/ScaleOffsetTest.kt +++ b/app-glasses/src/test/kotlin/pw/binom/viewmate/glasses/ScaleOffsetTest.kt @@ -5,6 +5,7 @@ import kotlin.test.assertEquals import pw.binom.viewmate.glasses.ui.Side import pw.binom.viewmate.glasses.ui.scaleOffsetX import pw.binom.viewmate.glasses.ui.verticalOffsetY +import pw.binom.viewmate.glasses.ui.videoOffsetY /** * scaleOffsetX — смещение контейнера глаза к центру (к носу): @@ -62,4 +63,29 @@ class ScaleOffsetTest { assertEquals(72, verticalOffsetY(480, 0.7f, 0.5f)) assertEquals(0, verticalOffsetY(480, 1f, 0.5f)) } + + /* + * videoOffsetY — видео внутри контейнера: верх при vertical=1, низ при 0. + */ + + @Test + fun videoTop_zero() { + assertEquals(0, videoOffsetY(432, 268, 1f)) + } + + @Test + fun videoBottom_pushedToContainerBottom() { + // 432 контейнер, 268 видео: ход = 164 + assertEquals(164, videoOffsetY(432, 268, 0f)) + } + + @Test + fun videoMiddle_halfOfRun() { + assertEquals(82, videoOffsetY(432, 268, 0.5f)) + } + + @Test + fun videoLargerThanContainer_noNegativeOffset() { + assertEquals(0, videoOffsetY(200, 268, 0f), "видео выше контейнера — хода нет") + } }