ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GSYVideoPlayer 比例适配:setShowType 的 5 种模式怎么选,黑边与变形一次讲清

GSYVideoPlayer 比例适配:setShowType 的 5 种模式怎么选,黑边与变形一次讲清 GSYVideoPlayer 比例适配setShowType 的 5 种模式怎么选黑边与变形一次讲清【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer详情页里一段 16:9 的视频上下黑边被用户截图吐槽横屏一放大人物又被拉长了。这类视频比例适配问题在 GSYVideoPlayer 里都归到同一个入口GSYVideoType.setShowType。本文先讲清这个静态入口的全局副作用再按业务场景给出选型最后给一个可以直接搬走的最小切换实现。一个入口管所有比例setShowType 全局生效先看入口。GSYVideoType.setShowType(int type)是静态方法参数写入类内部的静态字段TYPE读取用getShowType()。这意味着三件事全局生效设置之后进程内所有播放器实例包括还没创建的都按这个比例渲染不存在只对某个播放器生效的说法。不随释放还原播放器release()之后TYPE仍保持最后一次设置的值想恢复默认得再调一次setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT)。默认即原始比例从不改动的情况下画面保持视频原始宽高比。应对方式很直接把设置比例当成播放前的一次显式配置而不是初始化时写死一次就完事。多页面并存时列表页加详情页每个页面在创建播放器前显式设置自己场景需要的比例。如果你用getShowType()做过分支逻辑也要意识到读到的是全局值别把它当成当前播放器的私有状态。 记住一句话setShowType改的是全局不是当前播放器。另外还有一档没算在 5 种预设里SCREEN_TYPE_CUSTOM配合setScreenScaleRatio()可以自定义任意比例自研布局有固定画幅要求时用它。按场景选模式列表、详情、全屏、特殊填充列表流预览选默认比例。用户刷列表只关心内容完整小窗口里黑边是可接受的代价保持原始宽高比即可它本来就是初始值GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT);。详情页观影统一 16:9。现代影视、短视频几乎全是 16:9详情页强制这个比例控制栏和进度条的位置在所有视频间就保持一致用户切换剧集时不会感到控件跳动GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9);。如果源是老电视、纪录片这类 4:3 内容改用GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_4_3);代价是宽屏设备两侧出现明显黑边。横屏全屏沉浸选全屏裁减。体育、演唱会、直播这类内容观众能接受边缘被裁掉不能接受黑边。用GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL);注意源码注释提醒为了让封面显示正常surface_container的父布局建议用FrameLayout。监控、广告类特殊填充才用拉伸全屏。画面变形可接受、又必须铺满的场景监控墙、特殊广告位用GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL);。正常视频播放别碰它变形是肉眼可见的。最小可运行示例一个按钮循环 5 种比例下面是能跑起来的最小配置FrameLayout容器、标准播放器控制栏里加一个文本按钮。FrameLayout android:layout_widthmatch_parent android:layout_height200dp com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:idid/detail_player android:layout_widthmatch_parent android:layout_heightmatch_parent / TextView android:idid/moreScale android:layout_widthwrap_content android:layout_heightwrap_content android:layout_gravitybottom|end android:text默认比例 / /FrameLayout点击事件按 0→1→2→3→4→0 的顺序循环 5 种模式每次切换后手动触发渲染层重排这是 demo 里SampleVideo的做法mMoreScale.setOnClickListener(v - { if (mType 0) { mType 1; GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9); } else if (mType 1) { mType 2; GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_4_3); } else if (mType 2) { mType 3; GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL); } else if (mType 3) { mType 4; GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL); } else { mType 0; GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT); } changeTextureViewShowType(); mTextureView.requestLayout(); });changeTextureViewShowType()定义在GSYTextureRenderView里逻辑很简单比例不是默认值时把渲染 view 的布局参数从MATCH_PARENT换成WRAP_CONTENT。如果你自定义了渲染层记得保留这个调用否则比例切换后画面不会重排。全屏切换同步比例设置Android 播放器切全屏时GSYVideoPlayer 实际会创建一个独立的全屏播放实例。不同步状态的话用户选了16:9再点全屏画面会弹回默认比例体验上像是设置丢了。解法重写startWindowFullscreen把比例状态复制给新实例并立即应用退出全屏时在resolveNormalVideoShow里反向同步回来这是 demoSampleVideo的完整做法Override public GSYBaseVideoPlayer startWindowFullscreen(Context context, boolean actionBar, boolean statusBar) { SampleVideo fullscreen (SampleVideo) super.startWindowFullscreen(context, actionBar, statusBar); fullscreen.mType mType; fullscreen.resolveTypeUI(); // 内部调用 setShowType changeTextureViewShowType return fullscreen; }窗口和全屏各持有一份比例状态但真正生效的全局值始终只有一个来回同步的方向别搞反了。决策速查表模式常量推荐场景主要副作用SCREEN_TYPE_DEFAULT列表流、需完整画幅的内容容器比例不符时上下或两侧黑边SCREEN_TYPE_16_9详情页、影视播放非 16:9 源被裁剪SCREEN_TYPE_4_3老电视、纪录片等 4:3 源宽屏设备上两侧黑边明显SCREEN_TYPE_FULL体育、演唱会等沉浸场景边缘被裁减父布局建议FrameLayoutSCREEN_MATCH_FULL监控画面、特殊广告位画面拉伸变形继续深入gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/utils/GSYVideoType.java5 种预设常量和setShowType/getShowType的定义处app/src/main/java/com/example/gsyvideoplayer/video/SampleVideo.javademo 完整实现含按钮切换与全屏双向同步doc/USE.md官方文档切换比例小节另有setRenderType等同类全局开关比例适配本身不复杂复杂的是把它当全局状态来管理把setShowType的调用位置固定下来黑边和变形基本就不会再找上门。想验证更多边界情况仓库app模块里的 demo 可以逐个打开对照。【免费下载链接】GSYVideoPlayerVideo players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, and GIF screenshots, pre-roll and mid-roll ads, multiple simultaneous playback, basic seeking/dragging, volume and brightness adjustment, play-while-cache support项目地址: https://gitcode.com/GitHub_Trending/gs/GSYVideoPlayer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表