fix: 修复竖屏全屏播放错误问题

This commit is contained in:
“虞渠成” 2026-10-16 09:43:15 +08:00
parent 307915d6a0
commit 0c380c3021

View File

@ -176,13 +176,13 @@ namespace Kill.UI.Components
// 与子节点是否旋转无关。RectTransform 的 sizeDelta 在 UI 旋转 90° 后, // 与子节点是否旋转无关。RectTransform 的 sizeDelta 在 UI 旋转 90° 后,
// (sizeDelta.x, sizeDelta.y) 视觉上变成 (sizeDelta.y, sizeDelta.x)。 // (sizeDelta.x, sizeDelta.y) 视觉上变成 (sizeDelta.y, sizeDelta.x)。
// //
// 3. 视频长边贴齐策略(按视频/屏幕比例选边): // 3. contain 适配(按视频"视觉宽高比"与屏幕宽高比比较选边):
// 判定 = 视频短边占屏幕比 = 1/videoAspect vs 屏幕宽高比 // 视觉宽高比:UI 未旋转时 = videoAspect;UI 旋转90°后 = 1/videoAspect
// - 1/videoAspect > 屏幕比 → 视频长边贴屏幕短边(视觉宽=parentW,留黑上下) // - 视觉宽高比 > 屏幕宽高比 → 视觉宽铺满,视觉高 = 宽/视觉宽高比(留黑上下)
// 例:竖屏手机 750x1624 + 横屏视频 1.78 → 视觉=(750, 1335),sizeDelta=(1335, 750) // 例:竖屏手机 750x1624 + 横屏视频 1.78(旋转90°)→ 视觉=(750, 1335),sizeDelta=(1335, 750)
// - 1/videoAspect < 屏幕比 → 视频长边贴屏幕长边(视觉高=parentH,留黑左右) // 例:竖屏手机 750x1624 + 竖屏视频 9:16(未旋转)→ 视觉=(750, 1333)
// 例:接近正方形 1179x1600 + 横屏视频 1.78 → 视觉=(900, 1600),sizeDelta=(1600, 900) // - 视觉宽高比 < 屏幕宽高比 → 视觉高铺满,视觉宽 = 高*视觉宽高比(留黑左右)
// - 比例接近时(屏幕接近正方形)走"长边贴长边",让视频占用面积更大 // 例:接近正方形 1179x1600 + 横屏视频 1.78(旋转90°)→ 视觉=(900, 1600),sizeDelta=(1600, 900)
// //
// 4. 常见错误: // 4. 常见错误:
// - 用 cover 模式裁切 UV:横屏视频在竖屏手机上会左右被裁,丢失画面 // - 用 cover 模式裁切 UV:横屏视频在竖屏手机上会左右被裁,丢失画面
@ -214,17 +214,22 @@ namespace Kill.UI.Components
float screenVisualH = parentH; float screenVisualH = parentH;
// 按视频/屏幕比例决定贴齐哪一边,确保视频占屏幕比例最大化 // 按视频/屏幕比例决定贴齐哪一边,确保视频占屏幕比例最大化
float visualW, visualH; 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; visualW = screenVisualW;
visualH = visualW * videoAspect; visualH = visualW / visualVideoAspect;
} }
else else
{ {
// 视频长边贴屏幕长边(纵向贴满,留黑左右) // 视频视觉上更高:视觉高铺满(留黑左右)
visualH = screenVisualH; visualH = screenVisualH;
visualW = visualH / videoAspect; visualW = visualH * visualVideoAspect;
} }
// RectTransform 的 sizeDelta:UI 旋转 90° 时 (x,y) = (visualH, visualW) // RectTransform 的 sizeDelta:UI 旋转 90° 时 (x,y) = (visualH, visualW)
float rtW = rotated90 ? visualH : visualW; float rtW = rotated90 ? visualH : visualW;