android.hardware.camera 实现预览翻转
时间: 2023-11-25 10:07:19 浏览: 79
在 Android 中,可以通过设置 Camera.Parameters 中的 setPreviewSize 和 setPreviewFormat 方法来实现相机预览的翻转。
首先,需要获取当前设备支持的预览尺寸和格式。可以使用 Camera.Parameters 中的 getSupportedPreviewSizes 和 getSupportedPreviewFormats 方法来获取支持的预览尺寸和格式列表。
然后,可以通过 setPreviewSize 和 setPreviewFormat 方法来设置预览尺寸和格式。在设置预览尺寸时,需要根据设备的旋转角度进行调整,以保证预览画面正常显示。可以使用 CameraInfo 中的 orientation 字段来获取设备的旋转角度。
最后,可以使用 SurfaceView 或 TextureView 来显示相机预览画面,并使用 Camera.setPreviewDisplay 方法将预览画面与相机绑定起来。
下面是一个简单的示例代码,可以实现相机预览翻转:
```
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private Camera mCamera;
private int mRotation;
public CameraPreview(Context context) {
super(context);
getHolder().addCallback(this);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
// 获取支持的预览尺寸和格式
Camera.Parameters params = mCamera.getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
int format = params.getPreviewFormat();
// 根据设备旋转角度调整预览尺寸
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(0, info);
int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mRotation = (info.orientation + degrees) % 360;
mRotation = (360 - mRotation) % 360;
} else {
mRotation = (info.orientation - degrees + 360) % 360;
}
for (Camera.Size size : sizes) {
if (size.width * 3 == size.height * 4) {
params.setPreviewSize(size.width, size.height);
break;
}
}
// 设置预览格式和旋转角度
params.setPreviewFormat(format);
mCamera.setDisplayOrientation(mRotation);
mCamera.setParameters(params);
// 开始预览
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 暂时不需要处理
}
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
```
这个示例代码可以实现在相机预览时根据设备的旋转角度进行调整,保证预览画面正常显示。如果需要实现更复杂的功能,比如相机拍照、录制视频等,可以参考 Android 官方文档中的 Camera 相关章节。