【发布时间】:2017-06-18 13:30:30
【问题描述】:
我正在为 Camera2 使用 sample code,我想知道如何使预览和捕获的图像全屏显示? This SO question 似乎在视频模式下解决了它,但我找不到任何图像捕获的解决方案。示例片段底部有一个蓝色区域,并且还有状态栏。我想隐藏这两个并使用整个屏幕显示预览,并以全屏大小捕获图像。
【问题讨论】:
我正在为 Camera2 使用 sample code,我想知道如何使预览和捕获的图像全屏显示? This SO question 似乎在视频模式下解决了它,但我找不到任何图像捕获的解决方案。示例片段底部有一个蓝色区域,并且还有状态栏。我想隐藏这两个并使用整个屏幕显示预览,并以全屏大小捕获图像。
【问题讨论】:
Eddy 关于纵横比的说法是正确的。相机传感器是 4:3。屏幕通常是 16:9。示例代码选择显示整个相机预览,因此部分屏幕未填充。您需要拉伸以填满整个屏幕,但在这种情况下,捕获的图像包括预览中未显示的区域。
要全屏查看,在 AutoFitTextureView 中,将 onMeasure 方法更改为:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (0 == mRatioWidth || 0 == mRatioHeight) {
setMeasuredDimension(width, height);
} else {
if (width < height * mRatioWidth / mRatioHeight) {
// setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
} else {
//setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
}
}
}
更新: 正如 Eddy 所指出的,这将在全屏上显示相机预览的左上部分,而将底部和右侧留在视图之外,结果是图像偏离中心。 在我的特殊情况下,主体需要水平居中,所以我修改了变换矩阵以水平居中主体。代码如下:
// adjust the x shift because we are not showing the whole camera sensor on the screen, need to center the capture area
int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
Log.d(TAG, "screen width " + screenWidth);
int xShift = (viewWidth - screenWidth)/2;
matrix.setTranslate(-xShift, 0);
mTextureView.setTransform(matrix);
【讨论】:
请注意,摄像头传感器的纵横比与设备屏幕的纵横比通常不匹配 - 传感器的比例通常为 4:3,屏幕的比例通常约为 16:9。尽管两者之间存在很大差异。
由于纵横比不匹配,您需要决定是否要显示黑条,或缩放相机预览以填满屏幕(但图像的某些部分不可见) .
无论如何,要让预览全屏,您只需要将 TextureView(或 SurfaceView)设置为整个布局。所以基本上,编辑这个布局文件:fragment_camera2_basic.xml,删除所有其他视图,并删除源代码中对它们的引用。或者将它们更改为在 TextureView 之上,而不是在旁边 - 这是所有标准的 Android UI 布局的东西。您需要将您的活动设为full-screen。
默认情况下,AutoFillTextureView 会尝试保持纵横比,因此会产生黑条。如果你想要没有黑条,那你就得改一下 AutoFillTextureView,这并不简单,这里就不赘述了。
【讨论】: