3. 预览分辨率选择与适配

预览分辨率选择与适配 学习卡片

ResolutionSelector 与 Preview 分辨率适配

CameraX 的 Preview 默认会根据 PreviewView 尺寸和传感器能力自动挑选分辨率,但自动策略不一定符合业务预期。通过 ResolutionSelector 可以显式指定目标分辨率、宽高比策略和分辨率策略,从而控制预览画面的清晰度、比例与帧率表现。

核心对象是 ResolutionSelector,它由三部分组成:AspectRatioStrategy(宽高比策略)、ResolutionStrategy(分辨率策略)以及可选的 ResolutionFilter。三者共同决定 CameraX 从传感器支持的输出尺寸列表中挑选哪一个作为 Preview 的 Surface 尺寸。

传感器输出尺寸列表 (示例:某设备后置主摄) 4032 × 3024 (4:3) 3840 × 2160 (16:9) 1920 × 1080 (16:9) 1440 × 1080 (4:3) 1280 × 720 (16:9) 640 × 480 (4:3) CameraX 从该列表中 按策略筛选候选尺寸 ResolutionSelector AspectRatioStrategy RATIO_4_3 / RATIO_16_9 FALLBACK_RULE_AUTO FALLBACK_RULE_NEVER ResolutionStrategy HIGHEST_AVAILABLE FALLBACK_RULE_CLOSEST_LOWER FALLBACK_RULE_CLOSEST_HIGHER ResolutionFilter (可选) 自定义尺寸过滤逻辑 如限制最大宽度 策略组合决定最终 选中的 Preview 分辨率 Preview 输出与适配 选中分辨率 如 1920 × 1080 (16:9) PreviewView 缩放 FILL_CENTER FIT_CENTER 画面比例匹配 分辨率比例 vs 控件比例 不匹配则裁剪或留黑边 分辨率越高 → 画面越清晰 但帧率与功耗可能下降 候选 选中

关键参数与选择逻辑

在 CameraX 中,ResolutionSelector 通过 Builder 构建,常用配置如下:

  • setAspectRatioStrategy(AspectRatioStrategy.RATIO_16_9_FALLBACK_AUTO_STRATEGY):优先选择 16:9 比例,若无匹配则自动回退到其他比例。
  • setResolutionStrategy(ResolutionStrategy.HIGHEST_AVAILABLE_STRATEGY):在满足比例条件的候选中选择最高分辨率。
  • setResolutionStrategy(new ResolutionStrategy(new Size(1280, 720), ResolutionStrategy.FALLBACK_RULE_CLOSEST_LOWER_THEN_HIGHER)):指定目标尺寸 1280×720,优先选择不高于该尺寸的最近候选。

将 ResolutionSelector 设置到 Preview.Builder 上,再绑定到 ProcessCameraProvider,即可生效。注意:PreviewView 的 scaleType 决定画面如何填充控件区域,FILL_CENTER 会裁剪以填满,FIT_CENTER 会保留完整画面但可能留黑边。

示例:指定 16:9 最高分辨率并适配 PreviewView

// 1. 构建 ResolutionSelector
ResolutionSelector resolutionSelector = new ResolutionSelector.Builder()
    .setAspectRatioStrategy(AspectRatioStrategy.RATIO_16_9_FALLBACK_AUTO_STRATEGY)
    .setResolutionStrategy(ResolutionStrategy.HIGHEST_AVAILABLE_STRATEGY)
    .build();

// 2. 构建 Preview 并应用 ResolutionSelector
Preview preview = new Preview.Builder()
    .setResolutionSelector(resolutionSelector)
    .build();

// 3. 设置 PreviewView 缩放模式
previewView.setScaleType(PreviewView.ScaleType.FILL_CENTER);

// 4. 绑定到相机
preview.setSurfaceProvider(previewView.getSurfaceProvider());
cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, preview);

观察与验证

运行后可通过以下方式验证分辨率选择是否生效:

  • 在 preview.getResolutionInfo() 中读取实际选中的分辨率(CameraX 1.3+ 支持)。
  • 对比不同 ResolutionStrategy 下的预览清晰度与帧率:HIGHEST_AVAILABLE 画面最清晰但可能掉帧;指定 1280×720 则帧率更稳。
  • 切换 PreviewView 的 scaleType,观察画面是裁剪还是留黑边,判断比例适配是否符合预期。
若设备不支持 16:9 比例,RATIO_16_9_FALLBACK_AUTO_STRATEGY 会自动回退到 4:3 或其他可用比例,避免绑定失败。若希望严格限制比例,可使用 FALLBACK_RULE_NEVER,但需确认设备支持该比例。
高分辨率 Preview 会占用更多带宽和 GPU 资源,可能导致预览帧率下降或设备发热。在低端设备上建议指定 1280×720 或 1920×1080,而非直接使用最高分辨率。