外观
窗口快照 + 模糊图层,为什么能改善跨屏动效?
标准回答
我在跨屏搬移动效中采用了窗口快照加模糊图层的双层合成,替代搬移期间对实时窗口模糊的持续依赖,再用透明度渐变完成过渡。
这个取舍的出发点是,搬移时窗口状态和位置本来就在变化,如果模糊效果还要持续跟随实时内容处理,过渡就会承担额外渲染负担。使用快照与模糊图层后,可以用已准备好的内容承接这段视觉效果,把搬移过程中的主要变化集中到图层和透明度上。
代价是快照不反映之后的实时内容,所以它适合过渡,不能长期替代真实窗口。设计中要协调快照准备、新目标就绪和旧图层退出;动画取消、尺寸变化或截图失败时,也必须有清理和替代路径,避免快照一直盖住真实画面。
这项改动减少的是过渡阶段对实时模糊的依赖,不代表没有资源成本。快照准备、图层和图像内存仍然有开销。当前能确认的是方案及其落地,不能在没有测量记录时补出 GPU 降幅、帧率增长或内存减少的具体数字。
关键机制
- 取快照、准备模糊内容、建立层级、执行过渡与移除资源都需要协调;具体生成次数与实现 API 按实际代码说明。
- 要处理截图受限或失败、画面过时、尺寸变化、动画取消和目标未就绪,避免旧快照遮挡真实内容。
- 成本从持续处理转移到快照准备、图层与内存,不是完全没有代价;实际收益需要 Trace 或相关指标支撑。
通俗例子
在过渡期间用已有内容维持视觉连续,再在目标就绪时完成交接,是该设计的解释方式;不据此推断项目一定用了哪一套 SurfaceControl API。
追问与回答
为什么不一直使用截图?
因为截图是某个时刻的内容,不能持续反映交互、视频或业务状态变化。一直显示截图,视觉上可能平滑,功能上却已经变成冻结的画面。因此快照只负责明确的过渡区间,目标窗口准备好后要交回真实内容;失败时也要有退出策略,不能为了不闪不黑而永久保留旧画面。
遇到安全窗口怎么办?
要遵守系统对安全内容的截图和展示限制,不能为了保证动效而绕过保护。如果无法取得可用快照,就需要采用产品允许的替代过渡,例如受控背景或直接切换,并明确失败状态。具体采用哪种替代效果由产品与平台能力决定,但受保护内容不能因为动画需求被暴露出来。
易混淆点
材料没有帧率、GPU 降幅或内存峰值数值,不能临时补出量化结果;也不能把该方案直接写成某次黑屏缺陷的根因修复。
参考资料
内容来源
- Android 技术札记 · 原条目
project-blur