myMusic · 设计方案 · 2026-10-29 · 方向已确认,未实现

队列与歌单海报墙

给播放队列和歌单 / 专辑 / 榜单详情加一个可选的海报视图:曲目按封面铺成一面可以四向拖动的墙,正在播放的那首放大成 6×6 的大卡,卡里滚动歌词。版式和交互参考 folia-major 的 Lattice,外观换成 Material 3 Expressive:圆角、形状、配色和弹簧动效都沿用现有播放页那一套。原来的列表、队列面板和播放页都不动,海报墙只是多出来的视图。

手机 360×800 dp 平板横屏 1280×800 dp 电视 960×540 dp 新增:队列海报墙 · 详情页海报视图 · 听歌模式带状墙 · 6 个墙内设置 · 1 个入口设置 不改:播放页、队列面板、详情页列表、迷你播放器默认行为

无限的墙

12×8 单元为一块,四种模板加镜像拼接,向四周无限延伸,队列不够就从头循环。听歌模式的推荐流例外:排成一条往前长的带子。

大卡就地放大

点一格,它长成 6×6,同一块里其余 11 格按位移最小的方式重排,别的块不动。

卡里放歌词

正在播放的大卡显示前一行、当前行、后一行和翻译,逐字填色;没有歌词就露出清晰封面。

跟着切歌走

切到下一首,镜头滑到离屏幕中心最近的那一份,把它放大;整面墙换成新封面的配色。

两处可用

队列面板里进海报墙;歌单 / 专辑 / 榜单详情顶栏一键切成海报视图,并记住选择。

电视屏保

电视上 30 秒不操作,镜头开始缓慢漂移;按任意键回到正在播放。

参考

folia-major 的 Lattice 是怎么做的

右图是你给的截图。folia 源码里这面墙叫 Lattice,内容就是播放队列。下面的拆解来自读它的源码(AGPL-3.0,与本项目兼容)。

folia-major 的海报墙:深色背景上大小不一的封面格,正在播放的一格放大,里面显示日文歌词和中文翻译
  • 1
    格子大小由位置决定它不看播放量,也不按歌曲 id 随机。墙由 12×8 单元的块组成,每块有 12 个位;队列第 i 首坐第 i 个位,大小就是那个位的大小。最小的格是 2×2。
  • 2
    四个手画模板 × 四种镜像模板按块坐标线性步进((列 + 行×2) mod 4),相邻块一定不同;镜像按块坐标哈希,整面墙看不出周期。
  • 3
    无限平铺ceil(N/12) 个块组成一个偏横向的重复单元,向四周无限平铺,空出来的位从队列开头接着填。
  • 4
    放大只动一个块点一格不会直接播放,而是让它长成 6×6,同块其余 11 格换成预先算好的精确铺法,挑位移最小的那种。
  • 5
    切歌跟随切到下一首时,选离视口中心最近的那一份放大,镜头 0.42s 滑过去。另有一个“定位正在播放”按钮。
  • 6
    为性能做的取舍只渲染视口加 500 单位外扩范围内的格,最多 400 个;镜头平移直接写 transform,并对齐到整像素;故意不用 will-change,序号徽标也不加背景模糊。
原型

在这里直接试

队列是一张 30 首的混合歌单,封面都是程序画的。只有三首配了歌词:03《但愿人长久》、04《独上西楼》、21《送别》,都是古诗词,翻译行是我自己译的英文。歌词按演示速度走,每行 4.6 秒。

拖动平移 点格子放大 右下角设置
电视:先点一下画面← ↑ → ↓移焦点 Enter放大 / 播放 Esc返回

电视上 6 秒不操作,浮层控件淡出;再过一会儿镜头开始漂移(App 里是 30 秒,原型缩短到 12 秒,也可以直接点下面的“空闲漂移”)。漂移中按任意键,第一下只把镜头拉回正在播放。

上面第二排切到“歌单详情”,看详情页的海报视图(同一批歌换了顺序):一开始这张歌单没在放,所以没有大卡;点“播放全部”或某首的“播放”之后才出现。

切到“听歌模式”,看推荐流的墙:已经听了 4 首,队列里一共 15 首,后面是逐格变淡的占位格。连按“下一首”到只剩 3 首,占位格开始走微光,1.6 秒后续上 15 首,墙上原有的格子不动。

平板横屏 · 格距 102dp · 大卡 606dp
版式

块、模板与重排

沿用 folia 的块模板。我重新手画了四个模板,格子尺寸也限定在它那 11 种以内。放大后的重排在构建时离线算好,作为一张表打包进 App:4 个模板 × 4 种镜像 × 12 个位,共 192 种。

四个模板(未镜像)

格里的数字是位号,也就是这一块里第几首。位号按格子左上角的阅读顺序排(先行后列)。

放大一格时,这一块怎么重排

6×6 的大卡只能放在块内 8 个对齐位置之一:横向 0/2/4/6,纵向 0/2。剩下 60 格要正好用 11 块铺满,枚举所有铺法后取代价最低的一种。代价包括:其余 11 首按原顺序各就各位的中心位移之和,面积变化 × 0.35,再加上大卡离原格子的距离 × 2.2。

模板
放大第几位
设备格距(格 + 缝)最小格 2×2大卡 6×6一块 12×8说明
手机56dp(52 + 4)108dp332dp672×448dp大卡占满宽度,左右各留 14dp;标题最小 12.5sp,最多三行
平板横屏102dp(96 + 6)198dp606dp1224×816dp一块约等于一屏
电视76dp(71 + 5)147dp451dp912×608dp顶部控件行占到 80dp,大卡放在它下面,540dp 高度里刚好放下;10 英尺距离下 2×2 的标题约 14sp
大卡

放大卡的三种状态

同一个 6×6,按内容分三种。正在播放的那张是这一页唯一的主角,其他格子都压暗。

  1. 1
    正在播放 · 有歌词封面模糊后压 62% 的 surface 色。顶部是“正在播放 · 03”标签(primaryContainer,带三根跳动的条),下面是歌名和歌手。中间是歌词,底部是控件。
  2. 2
    正在播放 · 没有歌词封面不模糊,压暗减半;歌词区换成放大的歌名。纯音乐和取不到歌词的歌都是这个样子。
  3. 3
    别的歌封面清晰。左上角是“第 07 首 · 来源”,底部是 60dp 的大标题(手机 34dp),下面一排“播放 / 下一首播放 / 更多”。点“播放”就从这首开始,队列顺序不变。

歌词怎么排

当前行锚在歌词框 46% 的高度,前后各一行缩到 0.72、透明度 0.5–0.62 并轻微模糊,更远的几乎看不见。翻译只跟在当前行下面。

字号定死,不跳

每首歌开始时,按“3 行正文 + 2 行上下文 + 2 行翻译”的高度预算算出一个能放下的最大字号,整首歌都用它。换行时字号不跟着变。

逐字填色

有逐字时间轴(QRC/YRC/KRC)就逐字扫;没有就按整行时长线性扫。复用播放页现有的 karaoke Brush,不另写一套。

控件

平时只露出花瓣形播放键(Cookie12Sided,和播放页同一个组件)、波浪进度条和“打开播放页”。悬停、获得焦点或按空格时,上一首和下一首从播放键旁边展开。

何时挂歌词

放大的弹簧落定后,或者最多等 1 秒,才组合歌词组件。放大过程中只有封面和标题在动。

打开播放页

点 ↗,大卡里的封面走 SharedCover 飞回播放页的封面位置;从播放页进入海报墙则反过来。

交互

三端的操作

点格子是“放大看看”,不是“立刻播放”,和 folia 一致。这样手机、平板和电视的语义统一:选中先展开,展开后再决定播不播。

操作手机 / 平板电视(方向键)
移动四向拖动,松手带惯性;拖动不算点击方向键按空间位置移焦点(规则见下);焦点格出了安全区(四边内缩 40dp)才移镜头,只移最小距离
放大点格子焦点在格子上按 OK
播放 / 暂停大卡上的播放键焦点在正在播放的大卡上按 OK
播放别的歌大卡上点“播放”焦点在那张大卡上按 OK
歌曲操作长按格子,弹出现有的 SongActionsSheet长按 OK;面板末尾多出“回到正在播放”和“海报墙设置”两项(见下)
返回先关设置面板,再离开海报墙先关面板,再收起非当前的大卡,再清掉焦点,最后离开;遥控器的返回键,顶栏不放返回钮
回到正在播放右下角“定位”按钮。正在播放的那首没放大时,按钮高亮长按 OK →“回到正在播放”。电视顶排只有胶囊和时钟:方向键永远留在墙里,够不到的按钮不画
海报墙设置右下角“设置”按钮长按 OK →“海报墙设置”(队列海报墙和详情页海报视图一致);详情页海报视图的顶排工具栏本身能拿焦点,那里的“设置”钮保留
空闲—6 秒不操作,浮层控件和焦点环淡出,只剩墙和右上角时钟(沿用“电视时钟”设置);30 秒起镜头缓慢漂移,见下

方向键规则

第一次按方向键,只选中离屏幕中心最近的格子。之后的候选格必须整个位于前进方向上。得分 = 沿该方向的间距 + 横向错开时的惩罚(错开距离 × 2 + 一个格距),平分时选横向偏移小的。候选只在当前块和周围 8 块里找。

镜头少动

folia 每次移焦点都把焦点格居中,电视上这样会把正在播放的大卡推出画面。我们改成 Leanback 的做法:焦点在安全区里就不动镜头,出界才平移最小距离。点格子放大、切歌跟随和“定位”仍然居中。

焦点不放大

folia 获得焦点时整格放大一个缝宽。我们改成圆角加大 8dp、套上双圈焦点环、去掉染色。原因是 API 23–27 上 graphicsLayer 放大会把文字糊掉,播放页做的时候已经踩过一次。

空闲漂移(电视)

30 秒不操作后,镜头以 10dp/s 漂移,3 秒内从静止加速到这个速度。方向由两条慢正弦叠加(周期 19 秒和 31 秒),一直在拐弯,但没有急转。正在播放的大卡照常放大、照常走歌词,只是慢慢漂出画面;切歌时镜头仍跟到新歌那一份,然后接着漂。

唤醒

漂移中按任何键,第一下只唤醒:停住,镜头弹回正在播放的大卡,浮层淡入,焦点环回到原来的格子;这一下不执行键本身的动作。返回键也一样,免得一按就退出。

为什么要漂

电视常开着当背景放歌,一面静止的墙在 OLED 电视上会留下残影。漂移让每个像素都在变,又不像幻灯片那样跳。墙内设置里可以关,只在电视上显示这个开关。

焦点不进 Compose 焦点系统

墙是虚拟的、无限的,不在屏幕上的格子根本没有组合出来,Compose 的 focusSearch 找不到它们。所以由墙自己收方向键、自己记焦点;浮层按钮仍走普通焦点。

入口与设置

可选,不抢现有路径

默认不改任何人的习惯:迷你播放器点开仍是播放页,详情页打开仍是列表。队列海报墙有三个入口,也可以设成迷你播放器的默认去处;详情页在顶栏一键切成海报,之后记住。

  • 1
    队列面板标题栏“播放队列”面板右上角加一个海报墙按钮(网格图标)。三端都有,这是主入口。
  • 2
    播放页“更多”菜单浮动工具栏的“更多”里加一项“海报墙”。电视的控制坞同理。
  • 3
    迷你播放器(可选)设置 › 播放页 › “点按迷你播放器打开”:播放页(默认)/ 海报墙。
  • 4
    歌单 / 专辑 / 榜单详情顶栏右侧加“海报视图”按钮(手机);平板和电视加在左栏操作区。详见下一节。
设置位置选项默认AppStore 键
海报染色墙内设置面板关 / 弱 32% / 中 52% / 强 70%中poster_tint
关灯墙内设置面板开 / 关;开时除正在播放外压 82% 黑关poster_lights_out
显示队列序号墙内设置面板开 / 关开poster_index
显示歌词翻译墙内设置面板开 / 关开poster_translation
切歌时自动跟随墙内设置面板开 / 关开poster_follow
空闲时镜头漂移墙内设置面板,只在电视上出现开 / 关开poster_tv_drift
详情页视图不单独做设置项,记住上次列表 / 海报列表collection_view
点按迷你播放器打开设置 › 播放页播放页 / 海报墙播放页mini_player_target

墙内设置在队列和详情页之间共用一份。以上和播放页的几项设置一样,只存在本机,不进同步文件。墙内面板在手机上是底部弹出,平板上是 380dp 侧板,电视上是右侧面板,都用现有的 AdaptiveSheet。

详情页

歌单、专辑、榜单也能切成海报

同一个海报墙组件,换一个数据源:曲目来自这张歌单,序号是曲目序号。和队列墙的区别在于“这张歌单可能根本没在放”。

  1. 1
    怎么切换手机在顶栏右侧加一个“海报视图”图标按钮(操作行已经放了播放全部、收藏、多选,挤不下);平板和电视加在左栏的操作区。海报视图里,工具栏最右侧的列表图标切回来。选择记在 collection_view 里,下次打开任何详情页都沿用。
  2. 2
    刚打开、这张歌单没在放不放大任何格子,镜头对准第一块,01 在左上附近;配色取歌单封面。原来的头部(大封面、标题、播放全部)收成两样:顶部胶囊写标题和“歌单 · 网易云 · 30 首”,底部一条浮动工具栏放 播放全部 / 随机 / 收藏 / 定位 / 列表 / 设置。
  3. 3
    开始播放之后点“播放全部”、“随机”,或者在某首的大卡上点“播放”,队列换成这张歌单(和列表里点一行的行为一样),这首放大成正在播放的大卡,之后和队列墙一样跟着切歌走。
  4. 4
    正在放的歌就在这张歌单里例如从这张歌单播放后又回到详情页:一进来就把那首放大并居中,跟队列墙打开时一样。判断依据是当前歌曲的 key 在这张歌单里,不要求队列就是这张歌单。

工具栏

M3E 的 HorizontalFloatingToolbar:左边是 48dp 高的“播放全部”主按钮(primary),右边 5 个 48dp 图标钮(手机 40dp)。电视上放到顶部一排,和顶栏胶囊同一高度,底部留给大卡;焦点默认落在“播放全部”,和现在电视详情页一致。

多选不进海报视图

批量加入歌单、批量播放这些操作留在列表视图里。海报视图里长按格子只弹单曲的 SongActionsSheet,不进入多选。

没有封面的曲目

有些榜单和本地歌单的曲目没有单曲封面。兜底:用歌单封面取出来的颜色铺底,把歌名用大字直接排在格子里,再压一层颗粒,看起来像一张字体海报,不会出现灰色空格。

很长的歌单

重复单元是 ceil(N/12) 块,500 首的榜单就是 42 块,铺开很大,但只渲染视口附近的格子,成本和歌单长度无关。加载中显示同样版式的骨架格;加载失败沿用现有的 DiscoverErrorState。

自建歌单

本地歌单的详情页同样可以切换,但编辑模式(排序、删除、添加曲目)只在列表视图里。在海报视图里点“编辑”,会先切回列表。

循环铺满

和队列一样,曲目不足就从头循环。三首歌的专辑也会铺满一整面墙,大小不同的格子让重复的封面不至于单调。

听歌模式

推荐流不循环,只往前长

听歌模式(a18b1ab)的队列是服务端实时出的:QQ 电台一次最多 15 首,网易云私人漫游最多 18 首,队列剩 3 首时在队尾续一批。原方案“曲目不足就从头循环”放到这里会出错,所以队列墙在听歌模式下换一种排法。详情页的海报视图不受影响。

  1. 1
    为什么不能循环循环会把已经听过的歌排到正在放的这首后面,看起来像接下来要放,可接下来放什么,服务端还没给。另外重复单元的形状由首数决定(ceil(N/12) 块,列数按平方根取整):续一批,单元可能从 2 列变成 3 列,整面墙的格子全部换人,大卡那一份也会跳到别处。
  2. 2
    排成一条带子块按列排成固定高度的带子:手机 2 块高,平板和电视 1 块高,都正好盖住一屏,往右一直长。第 i 首仍然坐第 i 个位,模板和镜像仍由块坐标决定,所以续上来的歌只会填进后面的位,墙上已有的格子一个都不动。
  3. 3
    队尾的占位格已出的歌后面接 18 个占位格,逐格变淡,看得出墙还在往前长。续取中占位格上走一道微光;新的一批到了,占位格就地翻成封面,按入场的波依次落下。续取失败就停在占位格,不弹错,和现在的续流逻辑一致。
  4. 4
    镜头有边拖动限制在带子里:上下不出带子,左边到第一块,右边到最后一个占位格,甩动碰边就停。切歌跟随时镜头往前挪一两格,像时间线在走。电视空闲漂移碰到边就掉头,主要沿着带子横着漂。

什么时候算听歌模式

正在放的歌带着 listening_mode 标记,并且等于 ViewModel 里正在续流的模式(activeFeed)。换成别的队列时 play() 会清掉续流,墙退回循环排法,和换队列一样重新入场。App 重启后队列还在、续流没了,也按普通队列排。

顶栏胶囊

标题写模式名,比如“私人漫游”;副标题写“听歌模式 · 网易云 · 已听 12 首 · 后面还有 5 首”,续取中加上“正在续取…”。不写总首数,因为它一直在变。

大卡上的“播放”

实现成 seekTo 到队列里的那一项,不能调 play(song, queue):play() 会清掉 activeFeed,推荐流就断了。普通队列墙也按 seekTo 做,两边行为一致。“下一首播放”同样只在队列里挪位置。

开一晚上

听上几个小时,队列会有上百首,带子很长。格子只组合视口附近的,成本不变。“定位”直接算出当前这首的位置,因为每首只有一份,不用在附近找最近的那一份。

模式卡片页不加海报视图

歌单 › 听歌模式 那一页是入口,不是曲目表,点一下就开播;海报墙“先放大、再播放”的两步在那里是多余的。那些卡片本来就是封面铺满整卡,和海报墙的风格一致。

和律动跟拍

没有额外改动。推荐流里照常切歌,节拍跟踪按“切到另一首就清掉重来”处理;大卡跟拍和普通队列一样。

换成 M3E

照搬什么,改什么

版式算法、无限墙和交互语义照搬;外观层全部换成现有的 M3E 组件和 token。

元素foliamyMusic(M3E)
格子圆角直角短边 2 格时 12dp(手机 8、电视 10),3 格以上 16dp,大卡 28dp(extraLarge)。焦点时圆角加 8dp,走 fast spatial 弹簧
序号直角黑底、11px、粗 8006dp 圆角小牌,Roboto Mono 11sp。当前歌曲的其他副本,序号改主色
标题系统字体,按格宽在 22–36px 间缩放打包的 Roboto Flex 800,中文落到系统黑体;格宽 × 0.095,限 17–36sp(手机 12.5–21sp),最多三行
染色背景色混主题强调色,强度 0.5MaterialKolor 从当前封面取色得到的 surface,切歌时和整个 App 一起 450ms 过渡(M3E 的第二个主角时刻)
当前歌曲描边2px 强调色2dp primary;大卡 1.5dp primary 70%,加阴影
“正在播放”牌NOW PLAYING · 03,强调色字“正在播放 · 03”,primaryContainer 底,带三根跳动的条
播放键44px 圆形48dp Cookie12Sided 花瓣(现有 PlayPauseButton),播放时慢转
进度条2px 直线现有 WavySeekBar,暂停时波浪停住
工具按钮右下角玻璃面板“定位”48dp 圆钮 + 设置 56dp FAB(primaryContainer,16dp 圆角);面板走 AdaptiveSheet,选项用连接按钮组
动效Framer 弹簧(300/34、360/24)MotionScheme.expressive():重排用 defaultSpatial,焦点圆角用 fastSpatial,镜头用临界阻尼约 0.45s,颜色用 defaultEffects
歌词渲染Pixi WebGL,逐字辉光着色器Compose Text + 现有 karaoke Brush;不做辉光,旧电视盒子的 GPU 吃不消
实现

Compose 里怎么落

新建一个包 ui/poster/,不改播放页的代码。最大的风险是电视盒子上的帧率和封面分辨率。

文件内容
PosterSource.kt数据源抽象:Queue(播放队列,总有一首在放)和 Collection(歌单 / 专辑 / 榜单 / 本地歌单,可能没在放);提供曲目、标题、序号含义、点“播放”时调用的动作。Queue 带一个可空的 feed(模式名、平台、是否在续取),非空时墙按带子排
PosterWallScreen.kt队列海报墙的路由入口、浮层控件、设置面板、返回键优先级;三端共用,靠 LocalAppWindow 取格距
CollectionPosterView.kt详情页的海报视图:顶栏胶囊 + 浮动工具栏,嵌进 CollectionScreen 和 LocalPlaylistScreen,按 collection_view 和列表视图切换
WallGeometry.kt模板、镜像、块哈希、重复单元、songAt,以及听歌模式的带状排法 FeedBand(rows);纯 Kotlin,配单元测试,其中一条校验“续一批前后,已有曲目的位置不变”
WallReflowTable.kt192 种重排的常量表,由测试源码里的求解器生成;另有一个测试校验每种都正好铺满
WallCamera.ktAnimatable<Offset>,拖动后用 splineBasedDecay 甩出惯性,对齐到整像素;平移只在 layout 阶段读取,不触发重组。电视空闲漂移也在这里:withFrameNanos 循环推镜头,任意按键取消。听歌模式下有边界:甩动碰边停住,漂移碰边掉头
MusicViewModel.kt / UiStates.kt把私有的 activeFeed 暴露成 ListeningFeedUi(modeId, name, providerName, appending),开始续取和续完时更新;海报墙只读这一份
PosterWallLayout.kt自定义 Layout:只组合视口外扩两格内的格子,用 key(块x, 块y, 位) 复用;每格的位置是一个 Animatable<IntRect>,重排时走弹簧
PosterTile.kt / GrownPoster.kt小格、正在播放大卡、别的歌大卡;染色层画在 drawBehind 里,只在绘制阶段读取动画色(和 CollectionScreen 的 TintedGradient 同一个做法)
PosterLyrics.kt三行歌词,复用 LyricsParser 和 karaoke Brush;放大的弹簧落定后才组合
WallFocus.kt方向键空间导航(规则见“交互”一节)、OK 长按、返回键
CoverSizes.ktSong.coverAt(px):按格子实际像素选封面档位,见下表

封面分辨率是硬伤

现在列表请求的封面大多是 240–300px:酷狗用 {size} 替换成 240,QQ 用 T002R300x300。平板上的大卡要 1200px 左右。所以要按格子像素向上取档(240 / 480 / 800)去请求,Coil 的缓存键也按档位分开。

帧率预算

平板一屏约 30–40 格,电视约 25 格,外扩两格后不到 100 个。电视和 API 31 以下不做模糊:大卡背景改成压暗,不用 RenderEffect,走现有 BlurPolicy。入场动画在电视上只做淡入。

读屏

TalkBack 开启时,海报墙页顶部给一个“以列表浏览”的入口,直接打开原来的队列面板。每个可见格子都有完整的读屏文案:“第 3 首,独上西楼,邓丽君,正在播放”。

上游与许可

块模板的思路、重排规则和方向键评分都来自 folia-major(AGPL-3.0)。按项目惯例,实现时在 README 和 THIRD_PARTY_NOTICES 里写明上游地址、许可和借用了哪些部分。代码是重写的,没有直接搬它的 TS 源码。

平台现在的封面地址大图怎么取状态
酷狗{size} → 240按档位换成 480 / 800代码里已有占位符,需要实测哪些档位存在
QQ 音乐T002R300x300M000…换成 T002R500x500 / T002R800x800需实测
网易云原始 picUrl,不带参数加 ?param=480y480 这类参数,否则会拿到原图需实测
酷我…/star/albumcover/{尺寸}/…替换路径里的尺寸段需实测
汽水 / JOOXJOOX 用 %d → 300同理换档;汽水待查未知
分期与决定

怎么做、已经定了什么

五期,每期都能单独验收。四个待定问题已于 2026-10-29 确认,结论在下面;同一天补上了听歌模式的适配。

P1

能看的墙

  • WallGeometry、重排表和它们的单元测试
  • WallCamera:拖动、惯性、整像素对齐
  • 小格组件,带染色和序号;队列面板加入口
  • 听歌模式的带状排法和镜头边界
P2

大卡与跟随

  • 点格子放大、块内重排的弹簧动画
  • 三种大卡和控件,SharedCover 飞入飞出
  • 切歌跟随、“定位正在播放”按钮;大卡“播放”走 seekTo
  • 听歌模式的占位格、续取微光、新一批的落位动画
P3

歌词与电视

  • PosterLyrics:固定字号预算、逐字填色、翻译
  • 方向键空间导航、长按 OK、返回键优先级、空闲淡出
  • 空闲漂移和“第一下只唤醒”;听歌模式碰边掉头
  • 按格子像素取封面档位
P4

详情页海报视图

  • PosterSource 抽出 Collection 数据源,CollectionPosterView 嵌进三种详情页和本地歌单
  • 浮动工具栏、未在播放时的初始状态、collection_view 记忆
  • 无封面曲目的字体海报兜底、骨架格、错误态
P5

设置、入场、收尾

  • 墙内设置面板和设置 › 播放页里的入口设置
  • 入场波和退场反向波,减弱动效时只淡入
  • 电视盒子上测帧率、TalkBack 走查、README 和 THIRD_PARTY_NOTICES
1. 范围:播放队列和详情页都做歌单、专辑、榜单详情和本地歌单都能切成海报视图,见“详情页”一节;按分期,队列先做(P1–P3),详情页在 P4。
2. 点格子先放大,再点“播放”按 folia 的做法,三端一致。手机上播别的歌要点两下,换来的是不会误触换歌。
3. 曲目不足时循环铺满队列和详情页都一样,空位从头接着填,墙永远是满的。听歌模式的推荐流例外,不循环,见“听歌模式”一节。
4. 电视空闲时镜头漂移30 秒起漂,第一下按键只唤醒;墙内设置可关,默认开。细节见“交互”一节。