折叠屏预览满屏但成片被截断:HarmonyOS 7 相机画幅一致性验收

预览与成片共用裁剪契约

先定义什么叫“通过”

外屏预览采用方形满屏,用户构图时人物完整;展开后拍出的 4:3 成片却把头顶截掉。只验收“预览不黑屏”远远不够,预览、传感器输出和保存结果必须有可解释的画幅关系。

验证边界:本文依据文末列出的华为开发者官方页面整理,并用可执行的 TypeScript 状态模型检查应用侧分支。当前本机只有 API 24 工具链且没有连接 HarmonyOS 7 真机,因此文中的 API 26 接入片段属于按官方资料整理的接入骨架,不声称已经完成 API 26 编译、真机性能测试或设备兼容认证。正式上线前必须在目标 API 26 SDK 与真实设备上补齐编译、权限、异常码和性能证据。

失效机理

先定义业务目标:所见即所得、保留完整成片,还是允许预览裁切。根据窗口比例、输出 profile 和内容模式算出 contentRect,并在预览上展示真实安全区。拍摄结果如果需要二次裁剪,必须使用同一目标比例和方向信息,不能重新猜。

两组对照案例

案例一:方形外屏拍 1:1 头像

传感器输出可能不是 1:1。预览使用 centerCrop,同时在 contentRect 中标明最终方形成片;保存阶段按同一归一化裁剪框处理。

案例二:展开内屏拍 16:9 视频

窗口接近大屏比例,但视频 profile 仍按能力选择。预览采用 fit 或 crop 由产品决定,任何黑边和裁切都在录制前可见,折叠切换后重新计算安全区。

可重复的判定模型

type Size={w:number;h:number};
function crop(src:Size,target:number){const r=src.w/src.h;return r>target?{w:src.h*target,h:src.h}:{w:src.w,h:src.w/target};}
const c=crop({w:4000,h:3000},1);if(c.w!==3000||c.h!==3000)throw new Error('1:1 裁剪错误');

工程选择

把 contentRect 作为预览、触摸和保存共同契约,可以一次解决构图、点击对焦和成片一致性。简单拉伸到满屏会破坏比例;只在保存后裁剪则让用户无法预知结果。

验收矩阵

验证项通过标准
外屏1:1:预览安全区与成片一致有可重复步骤、日志或可见结果
展开4:3:不发生非预期拉伸有可重复步骤、日志或可见结果
16:9视频:实际 profile 与 UI 文案一致有可重复步骤、日志或可见结果
旋转后:裁剪框方向更新有可重复步骤、日志或可见结果
折叠中拍摄:按产品规则禁止或冻结本次配置有可重复步骤、日志或可见结果

官方资料与证据边界

本文没有给出固定设备输出尺寸。可用 profile、旋转和裁剪 API 应在 API 26 SDK 与目标机型查询;示例只验证比例计算。

1. Pura X Max 典型适配场景

2. HarmonyOS 设备布局基础

3. 折叠屏显示模式与状态

最后留下一个可复用结论

这篇文章不把“接口能调用”当成完成。真正可复用的是:先确定输入契约和生命周期,再把失败路径写进状态模型;平台能力负责提供机制,应用负责把机制变成可观察、可回退、可验证的工程链路。下一次遇到同类问题,先复现和记录证据,再调整实现,不靠重复重试掩盖根因。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐