本文记录当前项目实现的职责与验收路径,不包含外部项目的分析材料。
MainActivity 组装同窗口播放浮层;主页启用悬浮底栏、底栏显示且不使用侧边导航时显示圆形入口,其余页面使用可拖拽胶囊。core/ui/player/PlayerMorphHost 共用于朗读和有声书,管理布局锚点、飞行封面、返回与下拉手势;
PlayerMorphCover 统一终点封面的请求与交接;ReadAloudMorphState 是唯一动画进度源。朗读宿主只保留朗读设置与经典控制动作。ReadAloudCapsule 共用于应用内与应用外;ReadAloudOverlayWindow 负责 Android
窗口、权限检查和生命周期,附着现有朗读或有声书服务,复用已有播放状态。PlaybackCapsuleGateway 统一胶囊所需的封面、进度与控制动作;Android
适配器监听既有播放事件,不初始化播放器或加载目录。播放中的会话优先,都暂停时保留当前会话,停止后回退到另一存活会话。应用外窗口仅在胶囊开关开启、应用无可见 Activity 且拥有系统悬浮窗权限时显示。回到应用、停止服务或撤销权限时移除。
旧 MainRouteReadAloudPlayer 与 MainRouteAudioPlay 保留序列化类型和占位
entry,恢复旧栈时转入同窗口浮层并移除占位。播放浮层打开及退场期间清空下层导航与胶囊语义,收起结束后恢复。
形变期间冻结胶囊端点;完全展开后重新接收真实位置,覆盖先开播放页、后启动服务才出现胶囊的情况。首次打开时,胶囊宿主提前按保存位置布局同一个不可见组件,等待真实端点连续两帧稳定后开始。主页显隐独立于封面关联资格,最多等待 60 个布局帧;仍缺失锚点或目标布局时固定本次展开为无起点淡入,不虚构坐标,也不在途中接入迟到的锚点。关闭胶囊开关时立即使用淡入淡出,不等待布局;封面未关联当前播放会话时,只等待胶囊与面板布局,不等待封面飞行终点。
WRAP_CONTENT、非焦点与非触摸模态标志,主题不绘制全屏应用背景;窗口允许部分移出屏幕。自动回归覆盖形变端点、四角插值、背景交接、返回进度映射、旋转同步、窗口高度变化、位置往返、权限与显示条件、左右吸附和连续位置采样。
.\gradlew.bat :app:assembleAppDebug :app:testAppDebugUnitTest --tests "io.legado.app.service.readaloud.ReadAloudOverlayWindowTest" --tests "io.legado.app.service.readaloud.PlaybackCapsuleSelectionTest" --tests "io.legado.app.service.readaloud.PlaybackCapsuleGatewayAdapterTest" --tests "io.legado.app.ui.book.readaloud.morph.PlayerMorphFramesTest" --tests "io.legado.app.ui.main.PlaybackPlayerAnchorsTest" --tests "io.legado.app.ui.book.audio.AudioPlayViewModelInitializationTest" --no-configuration-cache
git diff --check
设备验收应覆盖:有声书书架/详情/通知/胶囊入口、各封面比例、歌词/目录页下拉、定时/换源弹层返回、主页与阅读页开合、首次启动朗读、动画反向、系统返回完成与取消、按钮展开、暂停旋转、外部应用触摸透传、权限撤销以及最后几帧封面与背景交接。编译和几何测试不替代动画观感与设备帧时间验证。
lintAppDebug 在 ModifierParameterDetector 分析 MainScreen.kt 时发生检查器异常,尚无通过的
lint 结果;没有关闭检查或放宽基线。