Android JavaCameraView设置match_parent未填满父布局weight分配空间问题
问题原因分析
- 核心是OpenCV自带的
JavaCameraView自带测量逻辑优先级高于布局属性:它的onMeasure方法默认会优先匹配相机采集的原始画面宽高比,避免预览画面拉伸变形,并不会严格遵循布局里设置的match_parent属性。 - Android Studio预览阶段无法读取真实相机的参数,只会按照布局声明的属性渲染,所以预览时可以正常占满父布局空间。真机运行时
JavaCameraView拿到真实相机的预览分辨率参数后,会按照相机比例重新计算自身尺寸,最终导致没有填充满父RelativeLayout的空间。 - 你当前布局中承载
JavaCameraView的RelativeLayout通过layout_weight=5分配了上层大部分空间,但是子View自身的测量逻辑覆盖了布局参数要求,就出现了父布局占满空间、子View高度不足的现象。
解决方案
- 方案一(简单快速,可接受轻微画面拉伸可选):
重写JavaCameraView的onMeasure方法,强制它匹配父布局尺寸:
public class FillCameraView extends JavaCameraView { public FillCameraView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 直接取父布局分配的宽高,不做比例适配 int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width, height); } }
后续布局中将原本的org.opencv.android.JavaCameraView替换为你自定义的FillCameraView的完整类路径即可。
- 方案二(无画面拉伸可选):
查询当前设备支持的相机预览分辨率,选择和父布局宽高比一致的分辨率作为相机预览尺寸,既可以保证画面不变形,也能填满父布局空间。
内容的提问来源于stack exchange,提问作者user21597761
相关产品推荐
相关产品推荐

