0

我目前在处理多个表面视图和剪切其中一个视图以使其显示为圆形时遇到问题。最好用图片来描述:

所以在这个视图中,我有 2 个表面视图,全屏视图显示相机的预览,然后顶部显示使用 MediaPlayer 播放文件。我已经通过以下行将顶部放在了预览之上:

surfaceView.setZOrderMediaOverlay(true);

现在你可以看到我试图用下面的代码把它屏蔽成一个圆圈:

@Override
protected void dispatchDraw(Canvas canvas) {

    Path clipPath = new Path();
    clipPath.addCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, Path.Direction.CCW);

    canvas.clipPath(clipPath);
    super.dispatchDraw(canvas);
}

但它似乎并没有完全解决。我最初认为这是我的掩码代码的问题,但事实证明,如果我删除预览表面视图,如下图所示,掩码工作正常

任何人都对为什么会发生这种情况或如何解决它有任何想法:S?

谢谢你的帮助

4

1 回答 1

3

请记住,SurfaceView 有两个部分,Surface 和 View,并且 Android 图形系统使用多个层。

您的所有视图都位于单个层上,通常简称为“视图 UI 层”。视图可以放置在彼此之上或之下,因为它们都被渲染到相同的像素缓冲区中。

表面出现在它们自己的层上。默认情况下,SurfaceView 的 Surface 位于 View UI 层的下方(后面)。SurfaceView 的 View 部分只是 View 系统用于布局的透明矩形。如果您在该视图上绘制(通过继承 SurfaceView 并覆盖绘制方法),您将渲染与 Surface 重叠的像素,使它们不透明。这是一种掩盖 Surface 的简单方法。

您的迷你播放器 Surface 使用setZOrderOnTop(),它将 SurfaceView 的 Surface 的层设置在 View UI 的顶部(前面)。如果您的 Surface 是部分透明的,这很方便,因为它可以让您看到它背后的视图。但是,您在 SurfaceView 的 View 上绘制的任何内容也会出现在它的后面,因此它不再用作遮罩。

您尝试做的问题是您希望通过角落处的上 Surface 可以看到下 Surface。您不能简单地用另一层屏蔽这些像素——您需要使它们在视频播放层本身上透明。这有点棘手,因为您需要将视频输入 GLES 纹理然后渲染它。

另请参阅图形架构文档

于 2016-02-26T02:35:33.457 回答