博观而约取,厚积而薄发。这篇文章主要讲述Android Camera2预览偶尔会旋转90度相关的知识,希望能为你提供帮助。
我正在使用android的Camera2 API开发一些应用程序。到目前为止,我已经能够在TextureView
中显示预览。该应用程序默认为横向模式。使用模拟器时,预览将显示为颠倒。在我的物理Nexus 5上,预览通常正确显示(横向,而不是颠倒),但有时它会旋转90度,但仍然会拉伸到屏幕的尺寸。我认为应该很容易,并认为以下代码将返回有关当前方向的必要信息:
// display rotation
getActivity().getWindowManager().getDefaultDisplay().getRotation();
// sensor orientation
mManager.getCameraCharacteristics(mCameraId).get(CameraCharacteristics.SENSOR_ORIENTATION);
...当我看到上面的代码总是为显示器旋转返回
1
而传感器方向返回90
时,我感到非常惊讶,无论预览是否旋转90度。 (在仿真器内,传感器方向始终为270,如果我假设90是正确的方向,则有意义)。我还在onMeasure
(从AutoMeasureTextureView采用)中检查Android's Camera2 example中的宽度和高度,我用它来创建我的TextureView。但是没有运气 - 无论预览轮换如何,onMeasure
内部报告的宽度和高度始终相同。所以我对如何解决这个问题毫无头绪。有没有人知道我的预览方向偶尔会出现什么原因?[编辑]我刚刚发现的一个细节:每当预览出现时,
onSurfaceTextureSizeChanged
中的TextureView.SurfaceTextureListener
似乎都没有被调用。在onSurfaceTextureSizeChanged
的文档中,据说只要SurfaceTexture
的缓冲区大小发生变化,就会调用此方法。我有一个方法createCameraPreviewSession
(从Android的Camera2示例复制),其中我设置我的纹理的默认缓冲区大小,如texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
从我的日志记录输出中我可以看出
onSurfaceTextureSizeChanged
在此之后被完全调用 - 但是,并非总是......(或者设置默认缓冲区大小有时会无声地失败?)。答案我想我可以回答我自己的问题:我在Android's Camera2 example之后创建了我的Camera2片段。但是,我并没有真正认为
configureTransform
方法很重要,因为与示例代码相反,我的应用程序无论如何都被强制为横向模式。原来,这个假设是错误的。由于configureTransform
重新整合到我的代码中,我没有经历过任何更多的打嗝。更新:Android文档页面中的原始示例似乎不再存在。我已经更新了现在指向Github上的代码的链接。
另一答案我在Nexus设备上也遇到了类似的问题.Below代码对我有用。在打开相机之前调用此功能。还有Resume()。
private void transformImage(int width,int height){
if (textureView == null) {return;
} else try {
{
Matrix matrix = new Matrix();
int rotation = getWindowManager().getDefaultDisplay().getRotation();
RectF textureRectF = new RectF(0, 0, width, height);
RectF previewRectF = new RectF(0, 0, textureView.getHeight(), textureView.getWidth());
float centerX = textureRectF.centerX();
float centerY = textureRectF.centerY();
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
previewRectF.offset(centerX - previewRectF.centerX(), centerY - previewRectF.centerY());
matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL);
float scale = Math.max((float) width / width, (float) height / width);
matrix.postScale(scale, scale, centerX, centerY);
matrix.postRotate(90 * (rotation - 2), centerX, centerY);
}
textureView.setTransform(matrix);
}
} catch (Exception e) {
e.printStackTrace();
}}
另一答案【Android Camera2预览偶尔会旋转90度】我按照上面列出的整个
textureView.setTransform(matrix)
方法,它工作。但是,我还能够使用更简单的textureView.setRotation(270)
手动设置旋转,而无需创建Matrix
。推荐阅读
- 如何在Android中旋转位图,使图像中心平滑,无振荡运动
- Android以XML格式访问SDK属性
- 如何解决Windows中的cmd或node.js命令提示符问题(git未安装或未在PATH中)
- 使用Javascript,HTML和CSS创建C#Windows .NET应用程序
- symfony项目中的供应商文件夹不会与(netbeans或svn)subversion一起上传
- Zoho邮件在Hotmail和Outlook用户的垃圾邮件文件夹中结束(解决方案)
- 使用Magento 2开发人员工具栏以正确的方式调试和配置Magento 2
- Magento 2 Elasticsearch Catalog Search索引器处理未知错误(除非将include_type_name参数设置为true,否则无法在放置映射请求中提供类型)
- 如何为你的Magento 2开发版本设置调试环境