3. 预览分辨率选择与适配
ResolutionSelector 与 Preview 分辨率适配
CameraX 的 Preview 默认会根据 PreviewView 尺寸和传感器能力自动挑选分辨率,但自动策略不一定符合业务预期。通过 ResolutionSelector 可以显式指定目标分辨率、宽高比策略和分辨率策略,从而控制预览画面的清晰度、比例与帧率表现。
核心对象是 ResolutionSelector,它由三部分组成:AspectRatioStrategy(宽高比策略)、ResolutionStrategy(分辨率策略)以及可选的 ResolutionFilter。三者共同决定 CameraX 从传感器支持的输出尺寸列表中挑选哪一个作为 Preview 的 Surface 尺寸。
关键参数与选择逻辑
在 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,而非直接使用最高分辨率。