恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
GSYVideoPlayer 比例适配:5 种模式怎么选、怎么接
首页
资讯中心
/
GSYVideoPlayer 比例适配:5 种模式怎么选、怎么接
GSYVideoPlayer 比例适配:5 种模式怎么选、怎么接
发布时间:2026/9/6 23:33:33
GSYVideoPlayer 比例适配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/GSYVideoPlayerGSYVideoPlayer 的视频比例适配只依赖一行静态调用GSYVideoType.setShowType()即可在 5 种比例模式之间切换无需改布局、无需动渲染层。场景类型推荐模式一句话理由典型 App 举例短视频信息流SCREEN_TYPE_DEFAULT竖屏源保比例上下留边观感自然抖音、快手影视详情页SCREEN_TYPE_16_9宽屏源与横屏容器最贴合爱奇艺、腾讯视频体育赛事 / 直播SCREEN_TYPE_FULL无黑边裁掉两侧不影响观感虎扑直播、央视频老视频 / 教学录播SCREEN_TYPE_4_3传统比例源不二次裁剪网课平台、档案馆监控墙 / 广告位SCREEN_MATCH_FULL必须铺满固定坑位变形可接受安防 App、开屏广告比例适配之所以比设个参数复杂核心矛盾有两个。第一setShowType()写入的是静态全局变量RecyclerView 里 N 个播放器实例共享同一个值后绑定的 item 会直接改写前一个实例下次测量读到的比例第二全屏是独立创建的播放器实例窗口态的比例状态不会自动传递过去旋转屏幕后比例会悄悄回退。一行代码切换比例的调用机制setShowType(int type)的签名极简但它不是实例方法而是写类级静态字段TYPE/** * 设置显示比例,注意这是全局生效的 */ public static void setShowType(int type) { TYPE type; }设置对当前活跃播放器的生效时机是下一次测量渲染层的MeasureHelper.doMeasure()在onMeasure时读取GSYVideoType.getShowType()据此计算 TextureView 的目标宽高。所以改完比例后要让正在播放的实例立即生效需要补一次changeTextureViewShowType()加requestLayout()Demo 的resolveTypeUI()就是这么做的。另外注意GSYVideoType没有reset()方法所谓复位就是重新调用setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT)。5 种模式在测量层的差异一次看全常量名视觉效果是否裁剪是否变形适用端SCREEN_TYPE_DEFAULT保持原始宽高比容器侧留黑边否否全端SCREEN_TYPE_16_9按 16:9 出画面源不符时留边否否宽屏源为主SCREEN_TYPE_4_3按 4:3 出画面宽屏设备上两侧黑边明显否否老视频源SCREEN_TYPE_FULL铺满容器超出部分裁掉是否横屏全屏SCREEN_MATCH_FULL强制拉伸到容器宽高是是特殊坑位两种最值得展开理解的模式全屏裁减SCREEN_TYPE_FULL测量时按高度撑满或宽度撑满取较大方向计算超出容器的边缘直接裁掉。源码注释明确建议surface_container用 FrameLayout 作父布局否则裁减后的画面位置会偏移。适合对画面边缘不敏感的体育赛事、演唱会直播是沉浸式全屏的主力模式。mMoreScale.setText(全屏); GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL);默认比例SCREEN_TYPE_DEFAULTMeasureHelper直接按视频真实宽高含 SAR 修正计算容器装不下时上下或左右留黑边不裁不拉。它是唯一在getTextureParams()里让渲染层走MATCH_PARENT的模式也是多实例共存时最安全的基线。其余三种SCREEN_TYPE_16_9与SCREEN_TYPE_4_3逻辑相同只是目标比例固定非等比源会在对应方向留边SCREEN_MATCH_FULL直接把测量结果写成容器全宽全高画面必然变形只建议给监控、广告这类必须铺满的坑位。从布局到全屏同步的完整走读下面按执行顺序走一遍完整链路。先放最小布局。比例裁减模式下surface_container的父容器建议是 FrameLayoutFrameLayout android:layout_widthmatch_parent android:layout_height200dp com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:idid/detail_player android:layout_widthmatch_parent android:layout_heightmatch_parent / /FrameLayout初始化后先定初始比例。这里把当前比例存进实例字段mType后面全屏同步要复用它int mType 1; // 对应 SCREEN_TYPE_16_9 mMoreScale.setOnClickListener(v - { mType (mType 1) % 5; resolveTypeUI(); });resolveTypeUI()里做两件事调静态方法改全局值再通知当前实例立即重测private void resolveTypeUI() { if (mType 1) { GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9); } // ... 其余分支同 Demo changeTextureViewShowType(); if (mTextureView ! null) mTextureView.requestLayout(); }最后一步是关键覆写startWindowFullscreen()把比例状态搬进全屏播放器。全屏窗口是另一个实例它启动时会按全局值重新测量但按钮文案和mType是自己的字段不同步就会出现画面是对的、按钮显示默认比例的状态漂移Override public GSYBaseVideoPlayer startWindowFullscreen(Context context, boolean actionBar, boolean statusBar) { SampleVideo sampleVideo (SampleVideo) super.startWindowFullscreen(context, actionBar, statusBar); sampleVideo.mType mType; sampleVideo.resolveTypeUI(); return sampleVideo; }SampleVideo.java 的startWindowFullscreen()与resolveNormalVideoShow()就是这条链路的完整参考实现退出全屏时反向回写一次mType。如果不做这两处同步用户旋转屏幕进入全屏后比例会回退到默认按钮文案也会和实际画面不一致。边界问题清单比例改动波及所有实例 →setShowType()是静态方法写的是类字段 → 每个实例开播前显式重设一次。列表滚动时比例被后续 item 覆盖 → RecyclerView 复用导致后绑定实例改写全局值 →onBindViewHolder中按 position 重设。自定义播放器比例不生效或布局错位 → 默认实现只改GSYRenderView容器 → 重写changeTextureViewShowType()落到自定义布局。全屏旋转后比例回退 → 全屏实例字段独立未继承窗口态的mType→startWindowFullscreen中同步并resolveTypeUI()。全屏退出后窗口播放器状态丢失 → 回写逻辑缺失 →resolveNormalVideoShow中反向同步。收束与延伸阅读比例适配的本质是两件事选对模式管好作用域。模式决定了测量公式作用域决定了这个静态值在窗口、全屏、列表复用之间如何流转。setShowType()负责前者startWindowFullscreen里的状态同步负责后者两者缺一就会出现黑边错位或比例回退。延伸阅读USE.md 中切换比例章节覆盖全部比例模式与常用组合GSYVIDEO_PLAYER_PROJECT_INFO.md 播放器整体架构理解渲染层如何消费比例值GSYVideoType.java 常量定义与setScreenScaleRatio自定义比例入口如果你的项目已经在自定义播放控件上投入较多下一个值得看的问题是如何在完全自绘的控件体系里让比例按钮和手势旋转共享同一份状态机。【免费下载链接】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),仅供参考