如何实现摄像全屏以及修改后的影响

摄像时候,不能全屏,上下或者左右有黑边。
发生此现象的原因:
预览大小是由设置的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();


posted @ 2015-09-01 11:51  稻香鱼  阅读(295)  评论(0)    收藏  举报