使用 MediaPlayer + TextureView 播放視頻,上下/左右出現黑邊,全屏模式下依然存在。
黑邊非 Bug,而是播放器為「保持視頻原始寬高比」而自動添加的信箱/柱狀邊距。 視頻幀尺寸與 TextureView 顯示區域尺寸不匹配時,系統默認 等比縮放 + 居中,多餘區域填黑。
在 onVideoSizeChanged 或 onPrepared 中,根據視頻寬高比動態設定 TextureView 的 LayoutParams,使其與視頻幀比例一致,父佈局背景設為黑色。
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
float videoAspect = (float) width / height;
int viewWidth = getWidth();
int viewHeight = getHeight();
float viewAspect = (float) viewWidth / viewHeight;
ViewGroup.LayoutParams lp = getLayoutParams();
if (videoAspect > viewAspect) {
// 視頻更寬 → 高度撐滿,寬度等比
lp.width = (int) (viewHeight * videoAspect);
lp.height = viewHeight;
} else {
// 視頻更高 → 寬度撐滿,高度等比
lp.width = viewWidth;
lp.height = (int) (viewWidth / videoAspect);
}
setLayoutParams(lp);
}
SurfaceView 繪製在窗口後方,需自行管理 Z-order 與縮放,TextureView 更靈活(支援動畫、透明度、旋轉),首選 TextureView。
Google 官方媒體庫內建 AspectRatioFrameLayout,自動處理比例適配、旋轉、HDR、DRM,極大降低坑位。
implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-ui:1.4.0"
不要試圖「去除黑邊」,要通過「調整顯示區域比例」或「使用成熟播放器庫」實現正確的視頻呈現。