CameraX beta03和底页滚动问题

问题描述 投票:5回答:1

我正在将我的项目中的cameraX alpha升级到1.0.0-beta03。我正在关注this。一切正常,我能够按预期拍摄图像。

但是我在相机片段中有一张底页。在实现beta03之后,在滚动底部工作表时,它似乎与某些不可见的视图重叠,如下所示:

enter image description here

经过一段时间的调试后发现,这仅在我将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索引和高程。它没有用

android bottom-sheet android-camerax
1个回答
1
投票

PreviewView.createSurfaceProvider()的文档说明:

返回的Preview.SurfaceProvider将提供一个预览Surface 由TextureView或SurfaceView管理的相机。这个 选项由首选的实现方式和 设备的功能。

请注意,预览图面是由TextureView还是SurfaceView管理,部分取决于您传入CameraInfoPreviewView.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的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.