我正在使用预览来显示相机在屏幕上看到的内容。
我可以让一切正常工作,创建表面,设置表面并显示表面。
但在纵向模式下,它总是以错误的 90 度角显示图片。
如图:
我知道使用下面的代码会使图片变得清晰:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
但是,我在一个包含其他元素的 Activity 中有预览,并且我的 Activity 以横向模式显示是没有意义的。 (默认关闭)
所以我想知道有没有办法改变预览的方向?并让我的 Activity 的其余部分以纵向模式正确显示?
或者无论如何要旋转预览以使其正确显示?
最佳答案
这个问题一开始似乎是某些硬件的错误 see here但可以通过调用 API 8 中提供的 mCamera.setDisplayOrientation(degrees) 来克服。所以这就是我实现它的方式:
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 Desire 上,我最初必须在每个轮换检查中放入日志语句以说明轮换是什么,然后在设备上进行调试并在我旋转设备时观察 logCat 输出。对于 HTC Desire,0 是您所期望的手机(纵向),90 度是将手机逆时针旋转 90 度(我以为它会是顺时针方向)。在代码中,您会看到当手机处于 90 度或 180 度时,我不需要进行任何显示旋转 - 设备似乎可以自行处理。只有一点不能正常工作: 270 度旋转是当您将设备顺时针旋转 90 度时,显示屏旋转计数器正常,但如果您将设备逆时针旋转 270 度,它似乎无法正确补偿。
附:注意在适当的旋转中宽度和高度的交换。
关于Android - 相机预览是横向的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841122/