gsy-fullscreen-orientation
概念
- 视觉全屏:
player.startWindowFullscreen(context, hideActionBar, hideStatusBar),会用反射克隆一个同类 player 塞进android.R.id.content顶部,返回原实例。 - 屏幕方向:
OrientationUtils监听OrientationEventListener+Settings.System.ACCELEROMETER_ROTATION,负责旋转 Activity 方向。 - 两者可解耦:只想旋转不切副本 →
setNeedOrientationUtils(false)+ 自建OrientationUtils;只想切副本不旋转 → 不构造OrientationUtils,player保持默认setRotateViewAuto(false)。
核心 API
| 类 / 方法 | 位置 | 说明 |
|---|---|---|
OrientationUtils(Activity, GSYBaseVideoPlayer) |
OrientationUtils#L50-L52 | 主构造 |
OrientationUtils(Activity, player, OrientationOption) |
OrientationUtils#L54-L64 | 支持自定义旋转角度阈值 |
setEnable(boolean) |
OrientationUtils |
使能/失能自动旋转 |
setRotateWithSystem(boolean) |
OrientationUtils |
是否跟随系统"旋转开关" |
setIsOnlyRotateLand(boolean) |
OrientationUtils |
true 时仅在横屏方向变化时响应 |
resolveByClick() |
OrientationUtils |
用户点全屏按钮时手动触发一次旋转 |
backToProtVideo() |
OrientationUtils |
返回键触发时把方向复位竖屏 |
setIsPause(boolean) |
OrientationUtils |
生命周期 pause/resume 桥接 |
releaseListener() |
OrientationUtils |
onDestroy 释放监听 |
startWindowFullscreen(Context, boolean, boolean) |
GSYBaseVideoPlayer | 进入 window 全屏,返回克隆体 |
GSYVideoManager.backFromWindowFull(Context) |
GSYVideoManager#L82-L94 | 返回键统一处理 |
GSYVideoManager.isFullState(Activity) |
GSYVideoManager#L143-L151 | 当前是否全屏 |
OrientationOption 参数
| 字段 | 默认 | 作用 |
|---|---|---|
normalPortraitAngleStart / End |
5 / 355 | 判定竖屏区间 |
normalLandAngleStart / End |
85 / 95 | 判定正向横屏区间 |
reverseLandAngleStart / End |
265 / 275 | 判定反向横屏区间 |
区间越大越"灵敏",太大会抖动。
关键调用序(详情页最佳实践)
onCreate:orientationUtils = new OrientationUtils(this, player);orientationUtils.setEnable(false)(进页面不自动旋转)- 全屏按钮点击:
orientationUtils.resolveByClick()→player.startWindowFullscreen(this, true, true) onBackPressed:orientationUtils.backToProtVideo()→GSYVideoManager.backFromWindowFull(this)onPause:orientationUtils.setIsPause(true)onResume:orientationUtils.setIsPause(false)onDestroy:orientationUtils.releaseListener()
GSYBaseActivityDetail 已把 1/2/3/4/5/6 全套代码写好,直接继承最省事。
Demo 对照
- 最标准的全屏 + 旋转:DetailPlayer
- 只旋转不切副本:LandLayoutVideo + DetailNormalActivityPlayer
- 反射克隆入口:GSYBaseVideoPlayer(
startWindowFullscreen→getConstructor(Context.class, Boolean.class))
常见坑
- 黑屏一瞬:
startWindowFullscreen用反射构造新 player,若你的子类只暴露(Context)构造且未加(Context, Boolean),R8 混淆后必炸。ProGuard 里必须保留:-keep class * extends GSYBaseVideoPlayer { public <init>(android.content.Context); public <init>(android.content.Context, java.lang.Boolean); } - 旋转停不下来:忘了
orientationUtils.setIsPause(true)或releaseListener()。 - 系统关了自动旋转但还想手动横屏:
setRotateWithSystem(false)。 - 竖屏视频被强制横屏:
setAutoFullWithSize(true)让 SDK 自适应。