Skills

Gsy List Playback

RecyclerView / ViewPager2 / ViewPager 列表滑动自动播放,滚动切换、复用绑定、进入详情页时"漂移"到全屏。

Install

npx skills add CarGuo/GSYVideoPlayer --skill gsy-list-playback -g -a claude-code -y
Repository
CarGuo/GSYVideoPlayer21.5k
Category
Engineering
Updated
25d ago
License
Apache-2.0
Context cost
Lightabout 876 tokens
Runs scripts
No, instructions only

What it does

RecyclerView / ViewPager2 / ViewPager 列表滑动自动播放,滚动切换、复用绑定、进入详情页时"漂移"到全屏。

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) #L347
  • setPlayPosition(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 小窗漂移

Read the whole SKILL.md on GitHub

More in Engineering