我正在将我的项目中的cameraX alpha
升级到1.0.0-beta03
。我正在关注this。一切正常,我能够按预期拍摄图像。
但是我在相机片段中有一张底页。在实现beta03之后,在滚动底部工作表时,它似乎与某些不可见的视图重叠,如下所示:
经过一段时间的调试后发现,这仅在我将camera?.cameraInfo
传递给viewFinder.createSurfaceProvider
时才发生。如果我传递null,则不会发生此问题。但是我不知道这意味着什么。
preview?.setSurfaceProvider(
viewFinder.createSurfaceProvider(camera?.cameraInfo))
当我在此处传递null时,底页完全显示出来。
这就是文档所说的:
/**
* Gets the {@link Preview.SurfaceProvider} to be used with
* {@link Preview#setSurfaceProvider(Executor, Preview.SurfaceProvider)}.
* <p>
* The returned {@link Preview.SurfaceProvider} will provide a preview
* {@link android.view.Surface} to the camera that's either managed by a
* {@link android.view.TextureView} or {@link android.view.SurfaceView}. This option is
* determined by the {@linkplain #setPreferredImplementationMode(ImplementationMode)
* preferred implementation mode} and the device's capabilities.
*
* @param cameraInfo The {@link CameraInfo} of the camera that will use the
* {@link android.view.Surface} provided by the returned
* {@link Preview.SurfaceProvider}.
* @return A {@link Preview.SurfaceProvider} used to start the camera preview.
*/
我在Google的示例应用程序中添加了一个随机的底部表,并在已复制错误的情况下将其推到here(Github link)。 (请构建Cameraxbasic
模块。我的分支是Bug_repro_bottomsheet
)
有人可以解释发生了什么以及如何解决此问题?
注意:我尝试更新底部工作表的z索引和高程。它没有用
PreviewView.createSurfaceProvider()
的文档说明:
返回的Preview.SurfaceProvider将提供一个预览Surface 由TextureView或SurfaceView管理的相机。这个 选项由首选的实现方式和 设备的功能。
请注意,预览图面是由TextureView
还是SurfaceView
管理,部分取决于您传入CameraInfo
的PreviewView.createSurfcaeProvider()
实例。
null
,则PreviewView
默认使用TextureView
。CameraInfo
实例,则PreviewView
会尝试使用SurfaceView
,但会退回到在某些设备(例如旧版设备,运行在API级别的设备)上使用TextureView
24以下,等等。回到您所看到的问题,当您传入非空CameraInfo
实例时就发生了,这可能是因为您测试的设备很好地支持SurfaceView
,所以PreviewView
使用了它。
当您拉起底页时,它停在SurfaceView
结束处。即使SurfaceView
似乎占据了整个屏幕,但它只占据了一部分(从屏幕顶部到底部页面停止的矩形),这是因为SurfaceView
被放大以填充整个屏幕(PreviewView
内部调用方法SurfaceView.setScaleX()
和PSurfaceView.setScaleY()
,导致预览扩展,但是SurfaceView
的边界,也就是它在View
层次结构中占据的矩形,不会改变)。
通过SurfaceView的documentation,您会看到:
表面是Z有序的,因此它在保持其表面的窗口后面 SurfaceView; SurfaceView在其窗口上打孔以允许其 要显示的表面。
SurfaceView
与典型的View
不同,它的处理/渲染与普通View
不同,并且其表面位于单独的图层上,与用于渲染View
层次结构的图形层无关。因此,如果您打算让其他View
滚动到预览顶部,则可能需要强制PreviewView
使用TextureView
来管理预览表面。您可以通过将null
传递到PreviewView.createSurfaceProvider()
或调用PreviewView.setPreferredImplementationMode(ImplementationMode.PreviewView)
来做到这一点。
您可以阅读有关PreviewView
here的更多信息。