当前 entry/src/main/ets/pages/NewIndex.ets 打开的是独立播放页 entry/src/main/ets/view/player/MusiPlayerView.ets,但该页面目前只保留了封面、标题和三个基础按钮,缺少原播放页中的进度条、当前时间、总时长、歌词主体等核心内容。
现象上表现为:
仓库中原完整播放页仍存在于 entry/src/main/ets/view/LocalMusic.ets 的 IjkMusicPlayerView() 链路中,但当前需求不是回退到原页面,而是继续保留独立播放页方向,并把原播放页的核心体验逐步迁移到 MusiPlayerView.ets。
第一阶段只恢复“核心可用”体验:
本阶段不纳入以下功能:
这些能力后续如果继续推进独立播放页,可在第二阶段单独迁移。
MusiPlayerView.ets 当前直接通过少量 @StorageLink 消费状态:
currentSongCONTROL_PlayStatusprogressValuecover这只能支撑最基础的静态展示,无法完整复用原播放页能力。原播放页中的关键信息还依赖以下链路:
playbackPositionMs、playbackDurationMs 驱动当前时间和总时长。currentSong.lyricContent 与 LyricController 驱动歌词 UI。因此当前问题不是单个按钮实现问题,而是独立播放页缺少完整的播放态输入和歌词渲染链路。
保持 entry/src/main/ets/view/player/MusiPlayerView.ets 作为独立播放页根组件,不回退到 LocalMusic.ets 直接渲染原页面,但补齐独立页自身需要的状态消费和展示层。
页面第一阶段按四层组织:
Swiper 两页,第一页展示封面主体,第二页展示歌词主体。Swiper 页、点光按钮状态、歌词控制器、派生时间文本。独立播放页继续以宿主同步到 AppStorage 的状态为唯一数据来源,不直接依赖 LocalMusic.ets 页面实例字段。
currentSongcoverCONTROL_PlayStatusprogressValueplaybackPositionMsplaybackDurationMscurrentTimetotalTimeSwiper 页索引LyricControllerPointLightOptionscurrentTime 由 playbackPositionMs 转换为 mm:ss 或 hh:mm:ss 文本。totalTime 由 playbackDurationMs 转换为时间文本。currentSong 或 currentSong.lyricContent 变化时,重新解析歌词并更新 LyricController。playbackPositionMs 变化时,同步刷新 currentTime,并推动歌词滚动位置。保留当前独立页的封面背景模糊与主体封面展示,但视觉结构尽量靠拢原播放页:
封面、歌名、歌手全部直接绑定 currentSong 和 cover,不保留临时静态文案。
恢复与原播放页相同的双页结构:
本阶段只保留最基础的左右切换,不引入更多操作按钮和歌词设置入口。
底部控制区复用已经独立出的 entry/src/main/ets/view/player/PlayerControls.ets,由 MusiPlayerView.ets 负责传入:
progressValuecurrentTimetotalTimecontrolPlayStatusonSeek这样可以避免在 MusiPlayerView.ets 里再次手写一份完整底部控制 UI,也让独立页后续扩展更稳定。
本阶段仅恢复“歌词主体显示 + 随进度滚动”。
优先使用 currentSong?.lyricContent。
如果当前歌曲没有内嵌歌词,则歌词区域展示空态提示,不在第一阶段继续接本地 .lrc 自动读取、复制歌词、歌词设置等历史能力。
在 MusiPlayerView.ets 内创建独立的 LyricController,不复用 LocalMusic.ets 持有的控制器实例。
currentSong 切换时:清空旧歌词,解析新歌词并喂给 LyricController。playbackPositionMs 更新时:调用歌词位置更新逻辑,推动高亮行滚动。本阶段保留以下基础交互:
本阶段不迁移以下交互:
目标不是逐像素复刻 LocalMusic.ets,而是优先恢复用户可感知的主结构一致性。
第一阶段要求:
允许与原页存在的差异:
MusiPlayerView.ets 中补充 playbackPositionMs、playbackDurationMs 的 @StorageLink。currentTime 与 totalTime。Swiper,分别承载封面页与歌词页。MusiPlayerView.ets 中接入 LyricController、歌词解析与歌词位置更新逻辑。PlayerControls.ets 替换当前简化版底部控制区,接入进度与时间。满足以下条件即可认为第一阶段完成:
原 LocalMusic.ets 中歌词逻辑与设置项、复制歌词、蓝牙歌词、PIP 文本节点等深度耦合。第一阶段必须明确截断边界,只迁移播放页主歌词显示所需的最小链路。
本阶段虽然继续使用 MusiPlayerView.ets 作为根组件,但要优先复用已有的独立子组件,例如 PlayerControls.ets,避免把原 LocalMusic.ets 中的大段 UI 直接整块复制过来。
独立页必须只消费宿主同步后的播放状态,不能一部分走 AppStorage,另一部分再去借 LocalMusic.ets 实例变量,否则后续仍会出现状态不同步问题。