gsy-list-playback
三条实现路线
| 路线 | 特点 | 适用 |
|---|---|---|
A. 每 item 内嵌 StandardGSYVideoPlayer |
每条 item 有独立 player 实例,滑到即播 | 大多数场景(含无限缩略页面) |
B. ListVideoUtil 单例复用 |
全列表共享一个 player 实例,动态 attachToParent |
内存敏感、条目多;不能同屏两个视频 |
C. GSYVideoHelper 悬浮小窗 |
用于详情页返回列表时"漂浮"续播 | 抖音式详情返回 |
路线 A:每 item 一个 player
关键点:在 onBindViewHolder 里给每个 player setPlayPosition(position) + setPlayTag(String),防止滚动复用导致 URL 命中错人。
GSYVideoOptionBuilder:
setPlayTag(String)#L347setPlayPosition(int)#L356
滚动出屏自动释放:RecyclerView.OnScrollListener → 当前 firstVisible / lastVisible 之外的 holder 调 GSYVideoManager.releaseAllVideos()。
见 RecyclerViewActivity。
路线 B:ListVideoUtil(跨 item 复用一个 player)
工具类:ListVideoUtil。
| API | 说明 |
|---|---|
ListVideoUtil(Context) |
单例创建(在 Activity/Fragment 里持一份) |
addVideoPlayer(int position, ImageView thumb, String tag, ViewGroup container, View playBtn) |
把 player 移到 container;tag 与 position 用于识别是否是新目标 |
setPlayPositionAndTag(int, String) |
手动更新目标 |
startPlay(String url) |
开始播放 |
isCurrentViewPlaying(int pos, String tag) |
判定当前播放是否在这个 item |
releaseVideoPlayer() |
释放,通常在离开页面时调 |
自动可视区触发用 ScrollCalculatorHelper 的 onScrollReleaseAllVideos(...) / onScrollPlayVideo(...)。见 AutoPlayRecyclerViewActivity。
路线 C:GSYVideoHelper 小窗漂移
工具类:GSYVideoHelper。核心思路:列表 item / 详情页共用同一个 player 实例,在离开列表时把 player parent 换到浮层容器,进入详情再换回去。
| API | 说明 |
|---|---|
GSYVideoHelper(Context, GSYBaseVideoPlayer) |
携一份 player |
setSmall(int width, int height, int gravity, int marginX, int marginY) |
小窗尺寸 |
showSmallVideo(...) / smallVideoToNormal() |
小窗 ↔ 正常 |
releaseVideoPlayer() |
释放 |
Demo:SmallVideoHelper(app 层包装) + ListVideoActivity。
ViewPager2 竖播
- 用
FragmentStateAdapter,每个 Fragment 内嵌StandardGSYVideoPlayer或NormalGSYVideoPlayer; ViewPager2.registerOnPageChangeCallback里onPageSelected→previousPlayer.onVideoPause(); currentPlayer.startPlayLogic();- 记得
setUserInputEnabled竖向。
Demo:ViewPager2Activity(RecyclerView 变体) + Compose 版 VerticalShortVideoComposeActivity。
常见坑
- 相同 URL 不重播:忘了
setPlayTag/setPlayPosition,setUp内部去重返回 false。 - 切换过快出黑帧:
setUp后立即startPlayLogic前先隐藏thumb;或用KeepLastFrameVideo保留上一帧(详见 doc/KEEP_LAST_FRAME.md)。 - 同屏多个 item 各自播放:单例
GSYVideoManager只能有一个 listener;同屏并行需要参考 CustomManager。