【问题标题】:CameraX beta03 and bottom sheet scroll issueCameraX beta03 和底页滚动问题
【发布时间】:2020-09-09 03:52:51
【问题描述】:

我在我的项目中将 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-index 和高度。它没有工作

【问题讨论】:

    标签: android bottom-sheet android-camerax


    【解决方案1】:

    对于androidx.camera:camera-view:1.0.0-alpha31,只需将兼容的implementationMode 设置为PreviewView(在setSurfaceProvider 之前)即可解决此问题:

    previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
    

    【讨论】:

      【解决方案2】:

      PreviewView.createSurfaceProvider() 的文档指出:

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

      请注意,预览图面是由TextureView 还是SurfaceView 管理,部分取决于您传递给PreviewView.createSurfcaeProvider()CameraInfo 实例。

      • 如果你传入nullPreviewView默认使用TextureView
      • 如果您传入一个非空的CameraInfo 实例,PreviewView 将尝试使用SurfaceView,但会回退到在某些设备上使用TextureView,例如传统设备、在 API 上运行的设备24级以下等。

      回到你看到的问题,当你传入一个非空的CameraInfo实例时就会发生这种情况,这可能是因为你测试的设备很好地支持SurfaceView,所以PreviewView使用它。

      当您拉起底部工作表时,它会在SurfaceView 结束处停止。尽管SurfaceView 似乎占据了整个屏幕,但它只占据了它的一部分(从屏幕顶部到底部工作表停止点的矩形),这是因为SurfaceView 被放大以填充整个屏幕(PreviewView 在内部调用方法SurfaceView.setScaleX()PSurfaceView.setScaleY(),导致预览拉伸,但SurfaceView 的边界,也就是它在View 层次结构中占据的矩形,不会改变)。

      通过SurfaceView的documentation,你会看到:

      表面是 Z 顺序的,因此它位于窗口后面 表面视图; SurfaceView 在其窗口中打了一个洞,以允许其 要显示的表面。

      SurfaceView 与典型的View 不同,它的处理/渲染方式与普通View 不同,它的表面存在于单独的层上,独立于用于渲染View 的图形层等级制度。因此,如果您打算让其他Views 在预览顶部滚动,您可能需要强制PreviewView 使用TextureView 来管理预览表面。您可以通过将null 传递给PreviewView.createSurfaceProvider() 或调用PreviewView.setPreferredImplementationMode(ImplementationMode.PreviewView) 来完成此操作。

      你可以阅读更多关于PreviewViewhere的信息。

      【讨论】:

      • 奇怪的东西。感谢您向我解释这一点。这似乎已经解决了。但是强制 ImplementationMode.PreviewView 在旧设备中会有问题吗?我的 minsdk 是 23
      • 不,不应该。到目前为止,TextureViews 似乎在 CameraX 支持的所有 API 级别(从 21 起)和旧设备上都可以正常工作。 PreviewView 尝试使用 SurfaceView,因为它比 TextureView 具有更好的性能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2021-08-29
      • 2019-12-18
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多