如何解决Camera2:使 SurfaceView 方面适合填充scaleType CENTER_CROP
我一直在关注 Camera2 示例 (android/camera-samples/Camera2Video) 以创建对 Camera2 库的抽象。我的抽象的想法是让用户能够使用 React Native 的相机视图,所以它只是一个 <Camera>
视图,可以是任何大小/纵横比。
虽然这在 iOS 上开箱即用,但我似乎无法在 Android 上获得预览以以正确的纵横比显示“相机看到的”。
Android 官方示例的工作方式如下:
- 他们创建了一个自定义的
SurfaceView
扩展程序,该扩展程序应自动适应正确的宽高比(请参阅:AutoFitSurfaceView
) - 他们使用
AutoFitSurfaceView
in their layout - 他们向
AutoFitSurfaceView
的Surface
添加了一个侦听器,以了解它的创建时间 (source) - 创建
Surface
后,它们会调用getPreviewOutputSize(...)
以获得最佳匹配的相机预览尺寸(例如,您不会为 1080p 屏幕流式传输 4k,这会浪费像素) - 然后他们将最匹配的相机预览尺寸传递给
AutoFitSurfaceView::setAspectRatio(...)
函数 - 通过了解所需的纵横比,
AutoFitSurfaceView
应在其onMeasure
覆盖中自动执行中心裁剪变换
如果您阅读其 getPreviewOutputSize(...)
函数的源代码,您可能会注意到它使用 Display
来查找最匹配的预览尺寸。如果我正确理解了代码,那么这仅在相机预览 (AutoFitSurfaceView
) 与设备屏幕大小完全相同时才有效。这设计得很糟糕,因为在很多情况下这根本不是真的。就我而言,相机有一点底部间距/边距,因此它不会填满屏幕,因此具有奇怪的分辨率(1080x1920 屏幕上的 1080x1585)
有了这么长的介绍,我的问题来了:我实际上如何在 SurfaceView 上执行正确的中心裁剪变换(又名 scaleType = CENTER_CROP
)?我尝试了以下方法:
- 使用
SurfaceHolder::setFixedSize(...)
设置我的 SurfaceView 的大小,但这根本没有改变任何东西 - 删除他们的
getPreviewOutputSize(...)
内容,只需使用可用的最高分辨率 - 使用 Android 视图属性
scaleX
和scaleY
通过视图的纵横比差异缩放视图 相机输入缩放器大小(这有点奏效,但如果我尝试使用高速捕获:Surface size 1080x1585 is not part of the high speed supported size list [1280x720,1920x1080]
)
感谢任何帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。