折叠屏预览满屏但成片被截断:HarmonyOS 7 相机画幅一致性验收
折叠屏预览满屏但成片被截断: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 与目标机型查询;示例只验证比例计算。
3. 折叠屏显示模式与状态
最后留下一个可复用结论
这篇文章不把“接口能调用”当成完成。真正可复用的是:先确定输入契约和生命周期,再把失败路径写进状态模型;平台能力负责提供机制,应用负责把机制变成可观察、可回退、可验证的工程链路。下一次遇到同类问题,先复现和记录证据,再调整实现,不靠重复重试掩盖根因。
更多推荐

所有评论(0)