Skip to content
阅读进度

多屏架构与画面承载 ​

返回项目专题

1. 多屏同看、跨屏流转和双屏贯穿有什么区别? ​

**标准回答:**多屏同看关注一份内容如何在多个显示端呈现,以及控制权、播放状态和音频如何协调。跨屏流转关注一个任务或业务会话如何从源屏转移到目标屏,同时维持界面、生命周期和输入行为。双屏贯穿关注内容如何布局到两个可视区域,包括坐标映射、裁剪和接缝。三者可以共用部分显示基础设施,但任务归属和交互模型不同。

例如视频同看可能让两个页面共享播放会话,也可能镜像画面;移屏通常要让目标端接管任务和输入;贯穿展示可能采用一个连续画布,也可能由两个窗口显示各自区域。具体采用哪条路径,要根据系统能力和内容类型判断。

**追问:同看是否一定是启动两个 Activity?**不是。可以是内容镜像、共享业务会话后的独立渲染,或由系统提供镜像能力。要说明你的实际实现,而不是用效果反推架构。

2. 为什么用窗口快照、模糊图层和透明度渐变? ​

**标准回答:**快照提供一份稳定的过渡画面,让动画暂时不依赖真实应用在迁移过程中持续完成重布局和绘制。模糊图层用于柔化过渡、遮蔽部分视觉突变,透明度渐变负责在不同画面承载之间平滑交接。项目确认采用了这三种手段,但具体模糊层的内容来源、捕获时机和层级需要用实际实现说明。

这套方案缓解的是视觉连续性。真实任务仍需完成迁移、配置处理和目标端绘制。快照不能修复业务状态错误,也不能保证目标端一定及时准备好;它还可能显示已经过时的内容。

**追问:为什么不直接移动真实窗口?**真实窗口会受到配置、布局、转场、Surface 生命周期和第三方应用行为影响。使用替身图层,可以把过渡表现和任务迁移的部分不确定性分开;代价是额外资源、同步与清理逻辑。是否值得,需要比较实际故障和性能成本。

3. 跨屏动画究竟移动的是 View、Window,还是 Surface? ​

**标准回答:**这取决于实现层级。普通 View 动画改变应用自己视图的属性,通常无法直接接管其他应用窗口。系统窗口转场可通过 SurfaceControl 操作图层的变换、透明度、裁剪和层级;Task 与 Activity 的目标显示和任务结构则由任务管理与窗口管理路径协调。项目使用窗口快照时,屏幕上飞动的画面可能是过渡图层,而真实任务在另一条路径迁移。

我会把两个问题分别说明:谁决定任务在哪个 Display;谁决定当前这一帧的图层怎样合成。两者有协调关系,但不是同一个动作。

**追问:一个窗口能直接在两个 Display 上同时飞动吗?**不能只凭画面效果断言一个真实窗口同时属于两个 Display。常见方案是在两端各准备过渡图层,用统一进度完成飞出与飞入,再交接真实窗口;也可能采用系统提供的镜像机制。具体图层树与显示归属要看目标 ROM。

4. 快照、模糊层和真实窗口的层级如何避免打架? ​

**标准回答:**先明确每个阶段应该由哪份内容承担显示:准备阶段保留源端可见内容,转场阶段由过渡图层承担表现,接管阶段让正确的目标真实画面逐步成为可见内容。图层的 parent、相对层级、alpha、crop、transform 和可见性应随阶段统一更新,而不是由几个模块各自修改。

如果快照比真实窗口提前消失,可能出现空白;如果真实窗口提前显示且尺寸尚未稳定,可能闪出一帧错误布局;如果模糊层残留,则可能表现为界面永久模糊或遮挡。排查时要记录图层身份、所属转场和每次可见性变更。

**追问:alpha 从 1 变到 0 就表示资源释放了吗?**不表示。不可见、移出图层树、释放句柄、回收快照缓冲区是不同事情。结束与取消路径都需要幂等清理,避免一次异常就留下图层或内存。

参考资料 ​

用完整回答理解机制,用真实证据解释项目。