这个问题一开始似乎是某些硬件see here的一个bug,但可以通过调用mCamera来克服.API 8中提供的setDisplayOrientation(度).我就是这样实现的:
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (isPreviewRunning) {
mCamera.stopPreview();
}
Parameters parameters = mCamera.getParameters();
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(height, width);
mCamera.setDisplayOrientation(90);
}
if(display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(width, height);
}
if(display.getRotation() == Surface.ROTATION_180) {
parameters.setPreviewSize(height, width);
}
if(display.getRotation() == Surface.ROTATION_270) {
parameters.setPreviewSize(width, height);
mCamera.setDisplayOrientation(180);
}
mCamera.setParameters(parameters);
previewCamera();
}
And the previewCamera method :
public void previewCamera() {
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
isPreviewRunning = true;
} catch(Exception e) {
Log.d(APP_CLASS, "Cannot start preview", e);
}
}
这是基于HTC的要求,我最初必须在每次轮换判断中输入日志(log)语句,以说明轮换是什么,然后在设备上进行调试,并在旋转设备时查看logcat输出.对于HTC的愿望来说,0是你所期待的手机(肖像),90度是逆时针转动手机90度(我原以为应该是顺时针).在代码中,你会看到当手机处于90度或180度时,我不需要做任何显示旋转--设备似乎可以自己处理这个问题.只有一点不能正常工作:270度旋转是当你顺时针旋转设备90度时,显示器旋转计数器正常,但如果你逆时针旋转设备270度,它似乎无法正确补偿它.
注意,在适当的旋转中注意宽度和高度的变化.