From 0c380c3021c06357c08232ec18d1e51d8008397c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=99=9E=E6=B8=A0=E6=88=90=E2=80=9D?= <“yuqucheng2006@qq.com”> Date: Fri, 16 Oct 2026 09:43:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AB=96=E5=B1=8F?= =?UTF-8?q?=E5=85=A8=E5=B1=8F=E6=92=AD=E6=94=BE=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/UI/Components/VideoCtrl.cs | 29 +++++++++++++---------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/Assets/Scripts/UI/Components/VideoCtrl.cs b/Assets/Scripts/UI/Components/VideoCtrl.cs index 22d24c7..38d3efe 100644 --- a/Assets/Scripts/UI/Components/VideoCtrl.cs +++ b/Assets/Scripts/UI/Components/VideoCtrl.cs @@ -176,13 +176,13 @@ namespace Kill.UI.Components // 与子节点是否旋转无关。RectTransform 的 sizeDelta 在 UI 旋转 90° 后, // (sizeDelta.x, sizeDelta.y) 视觉上变成 (sizeDelta.y, sizeDelta.x)。 // - // 3. 视频长边贴齐策略(按视频/屏幕比例选边): - // 判定 = 视频短边占屏幕比 = 1/videoAspect vs 屏幕宽高比 - // - 1/videoAspect > 屏幕比 → 视频长边贴屏幕短边(视觉宽=parentW,留黑上下) - // 例:竖屏手机 750x1624 + 横屏视频 1.78 → 视觉=(750, 1335),sizeDelta=(1335, 750) - // - 1/videoAspect < 屏幕比 → 视频长边贴屏幕长边(视觉高=parentH,留黑左右) - // 例:接近正方形 1179x1600 + 横屏视频 1.78 → 视觉=(900, 1600),sizeDelta=(1600, 900) - // - 比例接近时(屏幕接近正方形)走"长边贴长边",让视频占用面积更大 + // 3. contain 适配(按视频"视觉宽高比"与屏幕宽高比比较选边): + // 视觉宽高比:UI 未旋转时 = videoAspect;UI 旋转90°后 = 1/videoAspect + // - 视觉宽高比 > 屏幕宽高比 → 视觉宽铺满,视觉高 = 宽/视觉宽高比(留黑上下) + // 例:竖屏手机 750x1624 + 横屏视频 1.78(旋转90°)→ 视觉=(750, 1335),sizeDelta=(1335, 750) + // 例:竖屏手机 750x1624 + 竖屏视频 9:16(未旋转)→ 视觉=(750, 1333) + // - 视觉宽高比 < 屏幕宽高比 → 视觉高铺满,视觉宽 = 高*视觉宽高比(留黑左右) + // 例:接近正方形 1179x1600 + 横屏视频 1.78(旋转90°)→ 视觉=(900, 1600),sizeDelta=(1600, 900) // // 4. 常见错误: // - 用 cover 模式裁切 UV:横屏视频在竖屏手机上会左右被裁,丢失画面 @@ -214,17 +214,22 @@ namespace Kill.UI.Components float screenVisualH = parentH; // 按视频/屏幕比例决定贴齐哪一边,确保视频占屏幕比例最大化 float visualW, visualH; - if ((1f / videoAspect) > (screenVisualW / screenVisualH)) + // 视频在"视觉坐标系"下的宽高比: + // UI 未旋转时 = 视频原始宽高比 videoAspect(竖屏视频走未旋转的 portraitFullImage) + // UI 旋转90°后 = 1/videoAspect(横屏视频旋转后视觉上变竖屏) + float visualVideoAspect = rotated90 ? (1f / videoAspect) : videoAspect; + float screenAspect = screenVisualW / screenVisualH; + if (visualVideoAspect > screenAspect) { - // 视频长边贴屏幕短边(横向贴满,留黑上下) + // 视频视觉上更宽:视觉宽铺满(留黑上下) visualW = screenVisualW; - visualH = visualW * videoAspect; + visualH = visualW / visualVideoAspect; } else { - // 视频长边贴屏幕长边(纵向贴满,留黑左右) + // 视频视觉上更高:视觉高铺满(留黑左右) visualH = screenVisualH; - visualW = visualH / videoAspect; + visualW = visualH * visualVideoAspect; } // RectTransform 的 sizeDelta:UI 旋转 90° 时 (x,y) = (visualH, visualW) float rtW = rotated90 ? visualH : visualW;