摄像时候,不能全屏,上下或者左右有黑边。
发生此现象的原因:
预览大小是由设置的preview size决定的,摄像时的preview size必须跟video size同比例,否则预览或者录制出来的视频会有拉伸现象。
当录制16:9的video,预览区域就是16:9;当录制4:3的video,显示的区域就是4:3.
当屏幕分辨率(如果有虚拟按键需要除去虚拟按键占用的空间)跟video size不是同比例时,就会有黑边情况发生。
由于videosize是不建议更改的,因为480P/720P/1080P对应的video size是多少都是有规范的。
如果一定要实现摄像时候全屏,目前只有一种方式,就是将显示的区域同比放大实现全屏。但是放大之后,显示区域就会超出屏幕,
所以会有所见非所得的现象,录制出来的视频跟预览时候看到的视角有不同。
如果能接收如上的影响,可以根据下面的方法实现摄像全屏。
1. PreviewFrameLayout.java (alps\packages\apps\camera\src\com\android\camera\ui)
1) 添加变量
private boolean isVideoMode=false;
2) 添加方法
public void setCurrentMode(boolean videoMode) {
Log.d(TAG, "setCurrentMode isVideoMode=" + videoMode );
isVideoMode=videoMode;
}
3) 修改public void setAspectRatio(double ratio)方法
if (mAspectRatio != ratio) {
mAspectRatio = ratio;
requestLayout();
}
修改为:
if(isVideoMode)
{
mAspectRatio = ratio;
requestLayout();
}
else
{
if (mAspectRatio != ratio) {
mAspectRatio = ratio;
requestLayout();
}
}
4) protected void onMeasure(int widthSpec, int heightSpec)方法中
if (longSide > shortSide * mAspectRatio) {
longSide = Math.round((float)(shortSide * mAspectRatio) / 2) * 2;
} else {
shortSide = Math.round((float)(longSide / mAspectRatio) / 2) * 2;
}
修改为:
if(isVideoMode)
{
if (longSide > shortSide * mAspectRatio) {
shortSide = Math.round((float)(longSide / mAspectRatio) / 2) * 2;
} else {
longSide = Math.round((float)(shortSide * mAspectRatio) / 2) * 2;
}
}
else{
if (longSide > shortSide * mAspectRatio) {
longSide = Math.round((float)(shortSide * mAspectRatio) / 2) * 2;
} else {
shortSide = Math.round((float)(longSide / mAspectRatio) / 2) * 2;
}
}
2. Camera.java (alps\packages\apps\camera\src\com\android\camera)
private void setPreviewFrameLayoutAspectRatio()方法中:
mPreviewFrameLayout.setAspectRatio((double) width / height);
之前添加:
mPreviewFrameLayout.setCurrentMode(isVideoMode());
3. PositionController.java (alps\packages\apps\gallery2\src\com\android\gallery3d\ui)
添加方法:
public boolean isFullScreenCenter() {
Box b = mBoxes.get(0);
return (mPlatform.mCurrentX <= 50 && mPlatform.mCurrentX >= -50) && (b.mCurrentY <= 63 && b.mCurrentY >= -63);
}
4. PhotoView.java (alps\packages\apps\gallery2\src\com\android\gallery3d\ui)
protected void render(GLCanvas canvas)方法中:
boolean center = mPositionController.isCenter();
修改为:
boolean center = mPositionController.isFullScreenCenter();